1.队列的链接储存结构称为链列表,通常用单链表表示,因此此节点结构与单链表的节点结构相同。为了使空队列和非空队列,=的操作一致,链队列也加上了头结点。
2.为了操作上的方便,设置队头指针指向链队列的头结点,队尾指针指向终端节点。
3.链表示意图
4.代码如下
#include<stdio.h>
#include<stdlib.h>
/*
链队列
*/
//定义结构体
typedef struct node{ //定义链队列的节点结构
int data;
struct node *next;
}Node;
typedef struct link_queue{ //定义链队列
Node *front,*rear;
}LQ;
//初始化队列
void InitLinkQueue(LQ *q){
Node *s=NULL;
s=(Node*)malloc(sizeof(Node));
//判断内存是否申请成功
if(s==NULL){
printf("Malloc Failure
");
exit(-1);
}
q->front=q->rear=s; //将队头指针和队尾指针均指向节点s
}
//入队
void EnQueue(LQ *q,int enData){
Node *s=NULL;
s=(Node *)malloc(sizeof(Node));
if(s==NULL){
printf("Malloc Failure
");
exit(-1);
}
s->data=enData;
s->next=NULL;
q->rear->next=s; //将节点s插入到队尾
q->rear=s;
}
//出队
int DeQueue(LQ *q){
int deData;
Node *s=NULL;
s=(Node *)malloc(sizeof(Node));
if(s==NULL){
printf("Malloc Failure
");
exit(-1);
}
//判断是否为空表
if(q->rear==q->front){
printf("下溢
");
exit(-1);
}
deData=q->front->next->data;
s=q->front->next; //暂存队头元素
q->front->next=s->next;
//判断出队前 队列元素是否只剩剩下最后一个
if(s->next==NULL) q->rear=q->front; //此时队列中只有一个元素了
//释放
free(s);
return deData;
}
//取队头元素算法
int GetFront(LQ *q){
//判断队列是否为空
if(q->rear==q->front){
printf("下溢
");
exit(-1);
}
return q->front->next->data;
}
//队列判空算法
int Empty(LQ *q){
if(q->rear==q->front) return 1; //队列为空
else return 0;
}
//队列清空
void CleanQueue(LQ *q){
Node *s=NULL;
s=(Node*)malloc(sizeof(Node));
if(s==NULL){
printf("Malloc Failure
");
exit(-1);
}
while(q->front!=q->rear){
s=q->front;
q->front=s->next;
free(s);
}
//循环完了之后还剩下最后一个节点没有被释放
s=q->front;
free(s);
printf("Bingo
");
}
int main(void){
LQ *q=NULL;
int enData,deData,ret1,ret2;
char ch;
q=(LQ*)malloc(sizeof(LQ));
if(q==NULL){
printf("Malloc Failure
");
exit(-1);
}
//初始化
InitLinkQueue(q);
//入队
while(1){
printf("请输入入队的数:");
ret1=scanf(" %d",&enData);
if(ret1!=1){
//getchar();
fflush(stdin);
continue;
}
EnQueue(q,enData);
printf("是否继续:");
ret2=scanf(" %c",&ch);
if(ch!='y'&&ch!='Y'&&ret2==1){
break;
}
}
//出队
while(1){
printf("出队的数为:%d
",DeQueue(q));
printf("是否继续:");
ret1=scanf(" %c",&ch);
if(ch!='y'&&ch!='Y'&&ret1==1){
break;
}
}
//清空队列
CleanQueue(q);
system("pause");
return 0;
}