# 第三章 队列【数据结构】【链队列】

```#include<stdio.h>
#include<stdlib.h>
#define QElemType int
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int Status;
//------------单链表------------队列的链式存储结构
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
QueuePtr front,rear;//队头指针和队尾指针
//-----------------基本函数操作-----------------
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//构造一个空队列
if(!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
printf("请输入n个数\n");
for(int i = 1; i <= n; i ++)//读入n个数,并依次加入队列
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
scanf("%d",&p->data);
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
return OK;
}
//销毁队列Q
{
while(Q.front)
{
Q.rear = Q.front->next ;
free(Q.front);
Q.front = Q.rear ;
}
return OK;
}
//插入元素e为Q 的新的队尾元素
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);//存储分配失败
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
//若队列不为空，则删除Q的队头元素，用e返回其值，并返回OK，否则返回ERROR
{
if(Q.front == Q.rear )
return ERROR;
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
p = Q.front->next ;
e = p->data ;
Q.front->next = p->next ;
free(p);
return OK;
}

{
QueuePtr p = Q->front->next ;//将队列的头元素指针地址赋值给p
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next ;
}
printf("\n");
}
int main()
{
int n;
printf("请输入n\n");

scanf("%d",&n);//读入n个数，加入队列
InitQueue(Q,n);//初始化队列
printf("初始化后的队列为：\n");
PrintQueue(&Q);//输出队列中的元素

int e;
printf("请输入一个整数e\n");
scanf("%d",&e);//读入e
EnQueue(Q,e);//插入元素e为Q的新的队尾元素
printf("将e插入队尾后，队列更新为\n");
PrintQueue(&Q);//输出插入队尾后队列的值

DeQueue(Q,e);//删除Q的队头元素，用e返回其值
printf("删除队头元素后的队列为\n");
PrintQueue(&Q);//输出删除队头后的队列

DestroyQueue(Q);//销毁队列，释放存储空间
return 0;
}```