队列是一种先进先出的线性表。是线性表就会有链式存储,因为先进先出,
链队列就是在链尾进链头出,这样一来,
定义链队列时就需要定义两个指针,分别指向队列的队头(相当于头指针)、队尾。如果队头等于队尾,则该链队列为空。实现代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int LQEletype;
typedef struct QueueNode{
LQEletype data;
struct QueueNode *next;
}QueueNode;
typedef QueueNode *QueueP;//定义指向队列节点的指针(相当于头指针)
typedef struct LinkQueue{
QueueP front,rear;//定义队头指针(相当于头指针)、队尾指针
}LinkQueue;
void init(LinkQueue *q){
QueueP p=(QueueP)malloc(sizeof(QueueNode));
p->next=NULL;
q->front=p;//初始化一个空的链式队列。
q->rear=p;
}
void insertEle(LinkQueue *q,LQEletype e){
QueueP p=(QueueP)malloc(sizeof(QueueNode));
p->data=e;
p->next=NULL;//因为插入时在队列后边插入,next为空
q->rear->next=p;//让队尾指向插入的节点
q->rear=p;//重新指定队尾
}
void deleteEle(LinkQueue *q,LQEletype *e){
if(q->front==q->rear){
printf("该队列为空");
return ;
}else{
QueueP p=q->front->next;//拿到队列的第一个数据
*e=p->data;
q->front->next=p->next;//
if(q->rear==p){//如果拿到的这个数据节点恰巧是队尾,就重新指定队尾
q->rear=q->front;
}
free(p);
}
}
void getEle(LinkQueue q,LQEletype *e){
if(q.front==q.rear){
printf("该队列为空");
return ;
}else{
*e=q.front->next->data;
}
}
int main()
{
LinkQueue q;
init(&q);
LQEletype e,i=888;
getEle(q,&e);
printf("初始化后尝试获取队列里的值:\n%d\n",e);
insertEle(&q,i);
getEle(q,&e);
printf("插入后获取队列里的值:\n%d\n",e);
deleteEle(&q,&i);
getEle(q,&e);
return 0;
}