链队就是采用链式存储结构存储队列,这里采用单链表来实现 ~
- 链队定义
/* 链队结点类型定义,定义下图中 A,B,C 结点 */
typedef struct QNode{
int data;
struct QNode *next;
}QNode;
/* 链队类型定义,可理解为链队列的 “头结点” ,与单链表的头结点相比,链队列的头结点必不可少 */
typedef struct{
QNode *front;
QNode *rear;
}LiQueue;
- 初始化
void initQueue(LiQueue *&lqu){
lqu=(LiQueue*)malloc(sizeof(LiQueue)); //为链队列的 “头结点” 申请空间
lqu->front=lqu->rear=NULL; //头、尾指针皆指向空
}
- 判断队空
int isEmpty(LiQueue *lqu){
if(lqu->rear==NULL || lqu->front=NULL)
return 1;
else
return 0;
}
- 入队
/* 思路:链队的特点就是不存在队列满上溢的情况,所以不用考虑队满的情况。
1.申请空间,创建结点,其 data 为 x
2.若为原始队列为空队,则头、尾指针都指向新插结点
3.不为空队,则尾插法,即:lqu->rear->next=q; lqu->rear=q;
*/
void enQueue(LiQueue *lqu,int x){
QNode *p; //为将要插入的值 x 创建结点
p=(QNode*)malloc(sizeof(QNode));
p->data=x;
p->next=NULL;
if(lqu->rear==NULL)
lqu->front=lqu->rear=p; //队列中只有一个结点时,front 和 rear 指向同一结点
else{
lqu->rear->next=p; //尾插法
lqu->rear=p;
}
}
- 出队
/* 思路:存在空队情况,记得考虑
1.判断是否为空队列,若为空,则直接退出
2.不为空,则采用头删法出队,但注意要分情况
3.情况一:删完后队列没有结点 。情况二:删完后队列还有结点 。
*/
int deQueue(LiQueue *lqu,int &x){
if(lqu->rear==NULL || lqu->front==NULL)
return 0;
else
QNode *p;
p=lqu->front; //指向即将被删的结点
if(lqu->front==lqu->rear) //队列中只有一个结点时的出队操作需特殊处理
lqu->front=lqu->rear=NULL;
else
lqu->front=lqu->front->next; //头删法
x=p->data;
free(p);
return 1;
}
与链队相比,🖱️顺序队 的定义、操作等都要简单,因此在考研的程序设计题目中,要尽量采用顺序队来解决问题,尽可能地避免用链队,除非题目明确规定要用链队。