编程实现队列的入队/出队操作

思路:队列其实也是一个链表,只是队列还有两个特殊的结点,一个指向队头,一个指向队尾。先设计数据结构,如下

typedef struct student * PNode;
typedef struct linkqueue * Pqueue;

typedef struct student
{
    int data;
    PNode next;
}Node;

typedef struct linkqueue
{
    PNode first;
    PNode rear;
}queue;

1.入队操作其实是指向队尾的指针向后移,要判断队列是否为空或者只有一个结点的情况

2.出队操作其实是指向队头的指针向后移

整体代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct student * PNode;
typedef struct linkqueue * Pqueue;

typedef struct student
{
    int data;
    PNode next;
}Node;

typedef struct linkqueue
{
    PNode first;
    PNode rear;
}queue;

Pqueue insert(Pqueue link,int num)
{
    PNode p;
    Pqueue q=link;
        p=(PNode)malloc(sizeof(Node));
        p->data=num;
    if(link==NULL)
    {
        printf("添加第一个结点\n");
        q=(Pqueue)malloc(sizeof(queue));
        q->first=p;
        q->rear=p;
        q->rear->next=NULL;
        return q;
    }
    q->rear->next=p;
    q->rear=p;
    q->rear->next=NULL;
    return q;
}

Pqueue del(Pqueue queue)
{
    if(queue==NULL)
    {
        printf("队列为空");
        return NULL;
    }
    Pqueue q=queue;
    PNode temp;
    temp=q->first;
    if(q->first->next!=NULL)
        q->first=q->first->next;
    else
    {
        printf("队列只有一个结点,删除完毕\n");
        return NULL;
    }
    free(temp);
    return q;
}

void print(Pqueue link)
{
    PNode q=link->first;
    while(q!=NULL)
    {
        printf("%d ",q->data);
        q=q->next;
    }
    printf("\n");
}

int main(void)
{
    Pqueue linkqueue=NULL;
    int flag=0,num;
    while(1)
    {
        printf("选择入队或者出队:1为入队,2为出队,0为退出\n");
        scanf("%d",&flag);
        if(flag==1)
        {
            printf("请选择要入队的值:\n");
            scanf("%d",&num);
            linkqueue=insert(linkqueue,num);
            printf("打印入队后的队列:\n");
            print(linkqueue);
        }
        else if(flag==2)
        {
            linkqueue=del(linkqueue);
            printf("打印出队后的队列:\n");
            print(linkqueue);
        }
        else
            break;
    }
    printf("打印最后的队列:\n");
    print(linkqueue);
    return 0;
}
时间: 2024-10-29 19:09:47

编程实现队列的入队/出队操作的相关文章

循环队列的顺序存储和入队出队操作

今天看图的广度优先遍历的时候,发现用到了循环队列,补一下循环队列的知识,参考<大话数据结构>的P116~117,自己写了一个简单的测试例子便于理解. 首先需要理解以下三条公式. front是队头元素的下标,rear是队尾元素后一位的下标.(书上用头指针和尾指针,front和rear并不是指针,个人觉得不太好) 1.队列空的条件 显然front==rear 注意:如果队列不保留任何元素空间 满足front==rear的情况下,可能是队列空,也可能是队列满.所以为了方便,本文讨论的是采用保留一个元

入队/出队

入队/出队操作 #include<iostream> using namespace std; struct node { int data; node *next; }; struct queue { node *head; node *rear; }; //入队 queue *push_queue(queue *team,int x) { node *s=new node; s->data=x; s->next=NULL; if(team->rear==NULL) { t

JQuery源码分析 --- 运动animate 入队出队

我们都知道,所谓的运动就是操作定时器,但是如果我同时写3个运动,比如下面这样,效果会怎样呢? <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #div1{ width: 300px; height: 300px; background: red

队列的入队和出队操作

#include<iostream> #include<stdio.h> #include<string.h> #include<conio.h> using namespace std; typedef struct student{ int data; struct student *next; }node; typedef struct linkqueue { node *first, *rear; }queue; //队列的入队 queue *ins

循环队列的实现(出队,入队,遍历等)

队列的抽象数据类型定义为: 类型名称:队列. 数据对象集:一个有0个或多个元素的有穷线性表. 操作集:对于一个长度为正整数MaxSize的队列Q∈Queue, 记队列中的任一元素item∈ElementType,有: (1)Queue CreateQueue(int MaxSize):创建一个长度为MaxSize的空队列: (2)bool isEmpty(Queue Q):判断队列是否为空,若不空返回true(1),否则返回false(0): (3)void AddQ(Queue Q, Elem

循环队列:解决数组队列出队的时间复杂度

思路分析: 1.记录数组的队首和队尾的位置,当front 和tail指在一起的时候数组为空. 2.出队的时候front指针往后挪一位.这样出队操作就由数组队列的 O(N) 变成  循环队列的O(1)了. 让数组循环利用起来: 当前索引+1 再百分之我们数组的长度    比如我们到了最后一位7, 7+1 = 8 就是我们数组的长度    8对8 求余 = 0 就跟钟表一样   找到它的范围  然后让它在范围内循环.    1%12 = 1;  2 % 12 = 2; .... 11%12=11 1

链队列的初始化、入队、出队等操作实现

链队列的初始化.入队.出队等基本操作实现代码如下: #include<iostream> using namespace std; #define  TRUE 1 #define  FALSE 0 //链队列定义 typedef struct Node { int data;//数据域 struct Node *next;//指针域 }LinkQueueNode; typedef struct { LinkQueueNode *front;//队头指针front LinkQueueNode *

【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)

适配器: 将一个通用的容器转换为另外的容器,所谓的容器,指的是存放数据的器具,像我们知道的顺序表和链表都是容器Container.举个例子解释一下吧,我们的电压都是220v,而像充电线就起到转换到合适的电压的作用.而这里,我们的主角就是将通用的链表结构转换为来实现队列Queue这一数据结构,(意思就是,链表还可以去实现其他的数据结构). 在线性表中,分为链表和顺序表,我们知道其中的差别: 链表:节点灵活,使得插入删除元素方便灵活,但是对于单链表若有节点指针_head._tail,查找元素较为麻烦

队列基本操作—出队与入队

#include<stdio.h> #include<stdlib.h> typedef struct QNode { //构造结点类型 int data; struct QNode *next; }*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void CreateQueue(LinkQueue &Q);//创建队列 void EnQueue(LinkQueue &Q,