链式队列及基本操作(C语言实现)
链式队列的实现思想同顺序队列类似,只需创建两个指针(名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如图 1 所示:

图 1 链式队列的初始状态
图 1 所示为链式队列的初始状态,此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。
在创建链式队列时,强烈建议初学者创建一个带有头节点的链表,这样实现链式队列会更简单。
由此,我们可以编写出创建链式队列的 C 语言实现代码为:
//链表中的节点结构
typedef struct QNode{
int data;
struct QNode * next;
}QNode;
//创建链式队列的函数
QNode * initQueue(){
//创建一个头节点
QNode * queue=(QNode*)malloc(sizeof(QNode));
//对头节点进行初始化
queue->next=NULL;
return queue;
}
链式队列数据入队
链队队列中,当有新的数据元素入队,只需进行以下 3 步操作:
将该数据元素用节点包裹,例如新节点名称为 elem;
与 rear 指针指向的节点建立逻辑关系,即执行 rear->next=elem;
移动 rear 指针指向该新节点,即 rear=elem;
由此,新节点就入队成功了。
例如,在图 1 的基础上,我们依次将
{1,2,3} 依次入队,各个数据元素入队的过程如图 2 所示:
图 2 {1,2,3} 入链式队列
数据元素入链式队列的 C 语言实现代码为:
QNode* enQueue(QNode * rear,int data){
//1、用节点包裹入队元素
QNode * enElem=(QNode*)malloc(sizeof(QNode));
enElem->data=data;
enElem->next=NULL;
//2、新节点与rear节点建立逻辑关系
rear->next=enElem;
//3、rear指向新节点
rear=enElem;
//返回新的rear,为后续新元素入队做准备
return rear;
}
链式队列数据出队
当链式队列中,有数据元素需要出队时,按照 "先进先出" 的原则,只需将存储该数据的节点以及它之前入队的元素节点按照原则依次出队即可。这里,我们先学习如何将队头元素出队。链式队列中队头元素出队,需要做以下 3 步操作:
通过 top 指针直接找到队头节点,创建一个新指针 p 指向此即将出队的节点;
将 p 节点(即要出队的队头节点)从链表中摘除;
释放节点 p,回收其所占的内存空间;
例如,在图 2b) 的基础上,我们将元素 1 和 2 出队,则操作过程如图 3 所示:

图 3 链式队列中数据元素出队
链式队列中队头元素出队的 C 语言实现代码为:
注意,将队头元素做出队操作时,需提前判断队列中是否还有元素,如果没有,要提示用户无法做出队操作,保证程序的健壮性。void DeQueue(QNode * top,QNode * rear){
if (top->next==NULL) {
printf("队列为空");
return ;
}
// 1、
QNode * p=top->next;
printf("%d",p->data);
top->next=p->next;
if (rear==p) {
rear=top;
}
free(p);
}
总结
通过学习链式队列最基本的数据入队和出队操作,我们可以就实际问题,对以上代码做适当的修改。前面在学习顺序队列时,由于顺序表的局限性,我们在顺序队列中实现数据入队和出队的基础上,又对实现代码做了改进,令其能够充分利用数组中的空间。链式队列就不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。
这里给出链式队列入队和出队的完整 C 语言代码为:
#include <stdio.h>
#include <stdlib.h>
typedef struct QNode{
int data;
struct QNode * next;
}QNode;
QNode * initQueue(){
QNode * queue=(QNode*)malloc(sizeof(QNode));
queue->next=NULL;
return queue;
}
QNode* enQueue(QNode * rear,int data){
QNode * enElem=(QNode*)malloc(sizeof(QNode));
enElem->data=data;
enElem->next=NULL;
//使用尾插法向链队列中添加数据元素
rear->next=enElem;
rear=enElem;
return rear;
}
QNode* DeQueue(QNode * top,QNode * rear){
if (top->next==NULL) {
printf("\n队列为空");
return rear;
}
QNode * p=top->next;
printf("%d ",p->data);
top->next=p->next;
if (rear==p) {
rear=top;
}
free(p);
return rear;
}
int main() {
QNode * queue,*top,*rear;
queue=top=rear=initQueue();//创建头结点
//向链队列中添加结点,使用尾插法添加的同时,队尾指针需要指向链表的一个元素
rear=enQueue(rear, 1);
rear=enQueue(rear, 2);
rear=enQueue(rear, 3);
rear=enQueue(rear, 4);
//入队完成,所有数据元素开始出队列
rear=DeQueue(top, rear);
rear=DeQueue(top, rear);
rear=DeQueue(top, rear);
rear=DeQueue(top, rear);
rear=DeQueue(top, rear);
return 0;
}
程序运行结果为:
1 2 3 4
队列为空
- 随机文章
- 丽水 云和 马尔代夫(丽水云和人喜提马尔代夫,美景曝光!)
- 俄罗斯飞马尔代夫(俄罗斯将重新启动飞马尔代夫旅游计划)
- 四女 马尔代夫(四位女性的马尔代夫之旅)
- 七彩 马尔代夫(马尔代夫之旅 色彩缤纷的天堂之旅)
- 乐宜马尔代夫图文(浅谈乐宜马尔代夫:天堂般的旅行胜地)
- 抚州马尔代夫航拍(抚州市空拍神似马尔代夫,令人称赞!)
- 广东马尔代夫旅行(广东最美马尔代夫,开启清新度假之旅)
- 五月 马尔代夫(五月 马尔代夫旅游指南)
- 旺苍马尔代夫拍照(旺苍风景怡人,马尔代夫拍照美轮美奂)
- 中国帮助马尔代夫(中国援助马尔代夫,共同抗击新冠疫情)
- 孟买直飞马尔代夫(直飞孟买至马尔代夫,畅游蓝色海洋!)
- 湾流直飞马尔代夫(直达马尔代夫!湾流私人飞机带您飞行)
- 宁波马尔代夫风景(揭秘宁波马代美景,海岛风光美不胜收)
- 扮演马尔代夫的人(探索马尔代夫:水幕与白沙的完美融合)
- 漳州马尔代夫位置(漳州市首家模拟马尔代夫度假村落地!)
- 皖南马尔代夫风景(走进中国马尔代夫,探索皖南美丽风景)
- 深圳马尔代夫海鲜(深圳马尔代夫特色海鲜盛宴等你来享!)
- 行为艺术马尔代夫(马尔代夫:当下最热门的行为艺术天堂)
- 双人马尔代夫费用(双人梦幻马尔代夫:旅行所需费用一览)
- 金义都市马尔代夫(探索马尔代夫,享受金义都市奢华体验)
- 蓝田 马尔代夫(蓝田公布马尔代夫行政区划调整计划)
- 来马尔代夫看冰雕(体验北极风情,来马尔代夫观赏冰雕!)
- 柬埔寨去马尔代夫(柬埔寨旅游:选择度假胜地去马尔代夫)
- 马尔代夫低价陷阱(警惕!马尔代夫游客陷入低价诈骗陷阱)
- 长沙出发马尔代夫(长沙直飞马尔代夫,开启梦幻度假之旅)
- 赞美魅力马尔代夫(醉人的马尔代夫:一个令人陶醉的天堂)
- 杭州 马尔代夫(杭州旅游新亮点:豪华马尔代夫度假村惊艳登场)
- 老挝泰国马尔代夫(三国旅游胜地:老挝、泰国、马尔代夫)
- 马尔代夫动物捕食(马尔代夫动物食物链生态:捕食和生存)
- 马尔代夫何时开网(马尔代夫开放旅游业:何时恢复入境?)
