【数据结构】 链队列的基本操作 (C语言版)

目录

一、链队列

1、链栈的定义:

2、链栈的优缺点:

二、链队列的基本操作算法(C语言)    

1、宏定义

  2、创建结构体

3、链栈的初始化 

4、链队列的入队 

5、链队列的出队

6、取链队列的对头元素

7、链队列的销毁

8、链队列的清空

9、判断链队列是否为空

10、求队列长度

 11、遍历队列元素

三、链队列的基本操作完整代码(C语言)

  四、运行结果


一、链队列

1、链栈的定义:

链队列是一种线性数据结构,采用链表来实现队列的操作。链队列具有队头指针和队尾指针,用于指示队列元素所在的位置。链队列只允许在队尾插入元素,在队头删除元素,符合先进先出(First In First Out,FIFO)的原则。

2、链栈的优缺点:

链队列的优点:

  1. 动态分配空间:链队列使用链表实现,可动态分配和释放空间。因此,不需要预先分配大量存储空间,可以根据实际需求进行空间分配。
  2. 无需移动元素:相比普通队列,链队列在删除元素时无需移动大量元素,只需修改指针即可。这使得链队列在处理大规模数据时具有更高的效率。
  3. 适合处理用户排队等待的情况:链队列适用于处理用户排队等待的情况,例如银行排队、网络请求等。通过链队列,可以快速地插入新用户和删除已处理的用户。

链队列的缺点:

  1. 需要额外的存储空间:为了实现链表结构,链队列需要额外的存储空间来维护指针和节点。这会增加存储空间的消耗。
  2. 插入和删除操作可能引起内存分配和释放:在链队列中插入和删除元素时,可能需要动态分配和释放内存。这会增加操作的时间复杂度,并可能引起内存碎片化问题。
  3. 无法充分利用连续空间的优势:链表结构使得链队列无法像数组一样充分利用连续空间的优势,这会影响空间利用率和访问速度。

二、链队列的基本操作算法(C语言)    

1、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemtype;
typedef int Status;
  2、创建结构体
//创建结构体
typedef struct QNode {QElemtype data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;
} LinkQueue;
3、链栈的初始化 
//链队列的初始化
Status InitQueue(LinkQueue &Q) {Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));if (!Q.front) {exit(OVERFLOW);}Q.front->next = NULL;return OK;
}
4、链队列的入队 
//链队列的入队 
Status EnQueue(LinkQueue &Q, QElemtype e) {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;
}
5、链队列的出队
//链队列的出队
Status DeQueue(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) {Q.rear = Q.front;}delete p;return OK;}
6、取链队列的对头元素
//取链列的对头元素 
Status GetQueueHead(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.front->next->data;return OK;}
7、链队列的销毁
//队列的销毁
Status DestoryQueue(LinkQueue &Q) {while (Q.front) {Q.rear = Q.front->next;delete (Q.front);Q.front = Q.rear;}
//    printf("销毁成功!");return OK;
}
8、链队列的清空
//清空
Status ClearQueue(LinkQueue &Q) {Q.rear = Q.front->next;while (Q.front->next) {Q.rear = Q.rear->next;delete (Q.front->next);Q.front->next = Q.rear;}Q.rear = Q.front;
//    printf("清空成功!");return OK;
}
9、判断链队列是否为空
//判断是否为空
Status QueueEmpty(LinkQueue &Q) {if (Q.front == Q.rear) {
//        printf("队列为空!\n");return true;} else {return false;}
//    printf("该队列不为空!");
}
10、求队列长度
//求队列长度
Status QueueLength(LinkQueue Q) {int i = 0;while (Q.front != Q.rear) {i++;Q.front = Q.front->next;}
//    printf("该队列长度为:%d", i);return i;
}
 11、遍历队列元素
//遍历队列
Status QueueTraverse(LinkQueue Q) {QNode *p;if (Q.front == Q.rear) {return ERROR;}p = Q.front->next;//存储头元素printf("从队头依次读出该队列中的元素值为: ");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");return OK;
}

三、链队列的基本操作完整代码(C语言)

#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemtype;
typedef int Status;//创建结构体
typedef struct QNode {QElemtype data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;
} LinkQueue;//链队列的初始化
Status InitQueue(LinkQueue &Q) {Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));if (!Q.front) {exit(OVERFLOW);}Q.front->next = NULL;return OK;
}//链队列的入队 
Status EnQueue(LinkQueue &Q, QElemtype e) {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;
}//链队列的出队
Status DeQueue(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) {Q.rear = Q.front;}delete p;return OK;}//取链列的对头元素 
Status GetQueueHead(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.front->next->data;return OK;}//队列的销毁
Status DestoryQueue(LinkQueue &Q) {while (Q.front) {Q.rear = Q.front->next;delete (Q.front);Q.front = Q.rear;}
//    printf("销毁成功!");return OK;
}//清空
Status ClearQueue(LinkQueue &Q) {Q.rear = Q.front->next;while (Q.front->next) {Q.rear = Q.rear->next;delete (Q.front->next);Q.front->next = Q.rear;}Q.rear = Q.front;
//    printf("清空成功!");return OK;
}//判断是否为空
Status QueueEmpty(LinkQueue &Q) {if (Q.front == Q.rear) {
//        printf("队列为空!\n");return true;} else {return false;}
//    printf("该队列不为空!");
}//求队列长度
Status QueueLength(LinkQueue Q) {int i = 0;while (Q.front != Q.rear) {i++;Q.front = Q.front->next;}
//    printf("该队列长度为:%d", i);return i;
}//遍历队列
Status QueueTraverse(LinkQueue Q) {QNode *p;if (Q.front == Q.rear) {return ERROR;}p = Q.front->next;//存储头元素printf("从队头依次读出该队列中的元素值为: ");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");return OK;
}//功能菜单列表
void show_help() {printf("******* 功能菜单列表 *******\n");printf("1----入队------------------\n");printf("2----求链队列长度----------\n");printf("3----出队------------------\n");printf("4----取队头元素-------------\n");printf("5----清空循环队列-----------\n");printf("6----销毁循环队列-----------\n");printf("7----判断循环队列是否为空-----\n");printf("8----批量插入元素------------\n");printf("9----显示队列元素------------\n");printf("10----退出------------------\n\n");
}//主函数
int main() {LinkQueue LQ;Status reIn = InitQueue(LQ);if (reIn == OK) {printf("链队列初始时成功  \n");} else {printf("链队列初始时失败 \n");}while (1) {//功能菜单列表show_help();int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//入队Status EnQueueindex;printf("请输入插入元素(请在英文状态下输入例如:1): \n");scanf("%d", &EnQueueindex);Status rEnQueue = EnQueue(LQ, EnQueueindex);if (rEnQueue == OK) {printf("向链队列入队%d成功!\n", EnQueueindex);} else {printf("向链队列入队失败!\n");}}break;case 2: {//求链队列的长度int length = QueueLength(LQ);printf("链队列的长度为:%d。 \n\n", length);}break;case 3: {//出队QElemtype DeElem;Status DeEn = DeQueue(LQ, DeElem);if (DeEn == OK) {printf("从链队列中出队成功,出队的元素为 %d! \n", DeElem);} else {printf("从链队列中出队失败!\n");}}break;case 4: {//求队头元素QElemtype getEl;Status reGet = GetQueueHead(LQ, getEl);if (reGet == OK) {printf("从链队列中取对头元素成功,队头元素为:%d! \n", getEl);} else {printf("从链队列中取对头元素成功 \n");}}break;case 5: { //清空Status rClearStack = ClearQueue(LQ);if (rClearStack == OK) {printf("链队列清空成功!\n");} else {printf("链队列清空失败!\n");}}break;case 6: {//销毁Status rDestroyStack = DestoryQueue(LQ);if (rDestroyStack == OK) {printf("链队列销毁成功!\n");} else {printf("链队列销毁失败!\n");}}break;case 7: {///判空Status ClearStatus = QueueEmpty(LQ);if (ClearStatus == true) {printf("链队列为空!\n\n");} else {printf("链队列不为空!\n\n");}}break;case 8: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);QElemtype array[on];for (int i = 1; i <= on; i++) {printf("向链队列第%d个位置插入元素为:", i);scanf("%d", &array[i]);}for (int i = 1; i <= on; i++) {Status InsertStatus = EnQueue(LQ, array[i]);if (InsertStatus == OK) {printf("向链队列第%d个位置插入元素%d成功!\n", i, array[i]);} else {printf("向链队列第%d个位置插入元素%d失败!\n", i, array[i]);}}}break;case 9: {//输出链表元素QueueTraverse(LQ);
//                printf("\n");}break;case 10: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

  四、运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Defender存在威胁执行操作无反应且一直存在红叉(已解决)

文章目录 前言问题如图一、原因二、解决办法&#xff08;亲试有效&#xff09;总结 前言 Windows安全中心&#xff08;Windows Defender&#xff09;执行快速扫描/完全扫描后一直存在威胁&#xff0c;执行隔离或者删除操作后下次扫描还会扫出该威胁&#xff0c;但看威胁文件位置…

一些es的基本操作

目录 给索引增加字段&#xff1a;给索引删除字段[^1]&#xff1a;创建索引&#xff1a;插入document删除document(应该是按ID) : 给索引增加字段&#xff1a; 用postMan: 给名为population_portrait_hash_seven的索引增加了一个text类型的字段。 用chrome插件Elasticvue 的Re…

CentOS最优雅的方式安装mysql8

本来想偷个小懒使用yum/dnf安装一下mysq8,但是发现会出现各种问题,系统是CentOS8的. 于是还是使用最原始但是也是比较简单的方法来进行安装: 首先进入到https://dev.mysql.com/downloads/mysql/ 选择系统是Linux-Generic, 然后系统版本x86 64bit, 选择第一个TAR Archive的文件…

Vue3+Vite使用Puppeteer进行SEO优化(SSR+Meta)

1. 背景 【笑小枫】https://www.xiaoxiaofeng.com上线啦 资源持续整合中&#xff0c;程序员必备网站&#xff0c;快点前往围观吧~ 我的个人博客【笑小枫】又一次版本大升级&#xff0c;虽然知道没有多少访问量&#xff0c;但我还是整天没事瞎折腾。因为一些功能在Halo上不太好实…

什么是线程死锁

死锁是指两个或两个以上的进程&#xff08;线程&#xff09;在执行过程中&#xff0c;由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相…

喜讯!聚铭网络荣获“2023年网络安全十大优秀案例”称号

近日&#xff0c;由等级保护测评主办的2023年网络安全优秀评选活动结果正式公布。聚铭网络凭借其卓越的技术实力和优秀的项目实施能力&#xff0c;成功荣获“2023年网络安全十大优秀案例”称号。 为了挖掘网络安全行业优秀企业、案例与产品&#xff0c;充分发挥优秀网安企业各…

Sulfo Cy2 Biotin,水溶性 Cy2 生物素,能够与各种氨基基团特异性结合

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Sulfo Cyanine2 Biotin&#xff0c;Sulfo Cy2 Biotin&#xff0c;水溶性 Cy2 生物素&#xff0c;Sulfo-Cy2-Biotin&#xff0c;水溶性-Cy2-生物素 一、基本信息 产品简介&#xff1a;Sulfo Cyanine2 Biotin, also k…

开源运维平台Spug本地docker部署结合内网穿透实现远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

OceanBase创建租户

租户是集群之上的递进概念&#xff0c;OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念&#xff0c;是 Zone 和节点的集合&#xff0c;租户则偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括…

from sklearn.preprocessing import LabelEncoder的详细用法

sklearn.preprocessing 0. 基本解释1. 用法说明2. python例子说明 0. 基本解释 LabelEncoder 是 sklearn.preprocessing 模块中的一个工具&#xff0c;用于将分类特征的标签转换为整数。这在许多机器学习算法中是必要的&#xff0c;因为它们通常不能处理类别数据。 1. 用法说…

五款焊在电脑上的效率软件

在当今快节奏的商业环境中&#xff0c;提高工作效率成为了每个人都渴望实现的目标。尤其是在面对繁忙的工作日程、庞杂的任务清单和团队合作的压力时&#xff0c;我们需要一些可靠的工具来帮助我们更好地管理时间、组织工作和提高生产力。幸运的是&#xff0c;现在有许多高效的…

VC++中使用OpenCV进行人脸检测

VC中使用OpenCV进行人脸检测 对于上面的图像&#xff0c;如何使用OpenCV进行人脸检测呢&#xff1f; 使用OpenCV进行人脸检测十分简单&#xff0c;OpenCV官网给了一个Python人脸检测的示例程序&#xff0c; objectDetection.py代码如下&#xff1a; from __future__ import p…

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据&#xff0c;我们该如何将它们…

STM32_JTAG引脚及复用代码

目录 1.JTAG引脚1.1 说明&#xff08;可以不看&#xff09;1.2 引脚 2.复用代码3. 手册介绍&#xff08;可以不看&#xff09; 总是忘记有些引脚是JTAG复用的&#xff0c;导致偶尔浪费一些时间&#xff0c;记录一下。 1.JTAG引脚 1.1 说明&#xff08;可以不看&#xff09; …

【jetson笔记】vscode远程调试

vscode安装插件 vscode安装远程插件Remote-SSH 安装完毕点击左侧远程资源管理器 打开SSH配置文件 添加如下内容&#xff0c;Hostname为jetson IP&#xff0c;User为登录用户名需替换为自己的 Host aliasHostName 192.168.219.57User jetson配置好点击连接&#xff0c;控制台输…

全国首个!华为5.5G新突破:速率最高超4Gbps

“华为中国”官微宣布&#xff0c;近日&#xff0c;山东移动联合华为在青岛城区完成500个三载波聚合站点规模开通&#xff0c;标志着山东移动成为全国首个实现百站三载波聚合连片部署的运营商。 本次开通三载波聚合站点覆盖五四广场、八大关、青岛北站、中国海洋大学等热点区域…

谷粒商城配置虚拟机

一、创建虚拟机 之前有在VM里面建一个ubuntu的虚拟机&#xff0c;准备拿来直接用&#xff0c;网络设置为NAT模式&#xff0c;查看我的虚拟机是虚拟机&#xff1a;192.168.248.128 主机&#xff1a; 192.168.2.12。可以互相ping通。 二、linux安装docker Docker docker是虚拟…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

解决Xcode报错Stored properties cannot be marked unavailable with ‘@available‘

出现场景 打开一个IOS老项目时&#xff0c;Xcode提示以下错误 available(iOS, unavailable) //Stored properties cannot be marked unavailable with available解决方案 我们只需要把unavailable改成*号&#xff0c;同时增加版本号的限制。 // available(iOS, unavailabl…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时&#xff0c;临时提升为超级用户。例如&#xff0c;普通用户可以使用sudo执行系统管理任务&#xff0c;如安装软件、修改系统配置等。访问控制&#xff1a;sudo命令通过sudoers文件中的配置&#xff0c;可以对用…