链式队列是一种特殊的链表,只能在尾部添加,在头部删除,类似于排队问题,先入先出

链式队列的基本操作(入队、出队、遍历队列、清空队列)_出队


代码如下

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define
typedef int ElemType;
typedef struct Queue{
struct Queue*next;
int data;
}ListQueue; //接口
struct Queue*front=NULL;//指向队列首元节点的指针
struct Queue*rear=NULL;//指向队列尾节点的指针
int length=0; //控制队列长度,为了方便第一次入队
ListQueue *createQueue() //初始化
{
ListQueue *s=(ListQueue *)malloc(sizeof(ListQueue));
if(!s)
{
printf("内存分配失败!");
exit(ERROR);
}
s->next=NULL;
length++;
return s;
}
void PushQueue(ListQueue *s) //入队
{

ListQueue *p=(ListQueue*)malloc(sizeof(ListQueue));
if(!p) //创建失败
{
printf("内存分配失败!");
exit(ERROR);
}
printf("请输入你要数据的数据:");
int a;
scanf("%d",&a);
p->data=a;
p->next=NULL;
if(length==1) //第一次入队
{
front=rear=p;
s->next=front;
}
else //第n+1次入队(n>=1)
{
rear->next=p;
rear=p;
}
length++; //控制是否为第一次入队,初始化时length已经为1;
}
void PopQueue(ListQueue*s) //出队
{
if(front==NULL||rear==NULL)
printf("该队列已空!");
int v;
v=front->data;
s->next=front->next;
free(front);
front=s->next;
printf("该出队的数据为:");
printf("%d",v);
}
void Display(ListQueue*s) //遍历队列
{
ListQueue*v=s->next;
while(v)
{
printf("%d->",v->data);
v=v->next;
}
}
void DestoryQueue(ListQueue *s) //清空队列并且销毁头节点
{
ListQueue *v=s->next;
while(v)
{
front=v->next;
free(v);
v=front;
}
printf("该队列已清空!");
free(s);
printf("\n");
printf("头节点释放成功!");
}
int main()
{
ListQueue *t=createQueue();
PushQueue(t);
PushQueue(t);
PushQueue(t);
printf("该数据如下");
Display(t);
printf("\n");
printf("出队!");
PopQueue(t);
printf("\n");
printf("余下数据如下:");
printf("\n");
Display(t);
printf("\n");
DestoryQueue(t);
return 0;
}