数据结构:单链队列

文章目录

        • 队列:
        • 单链队列的实现及操作:
          • 1.定义一个队列
          • 2.构造一个空队列
          • 3.销毁队列
          • 4.插入元素e到队尾
          • 5.删除队头元素,用e返回其值
        • 单链队列操作实例及代码:

队列:

队列是先进先出的线性表。

队列只允许在表的一端插入元素,在另一端删除元素。

队列中允许插入的一端叫队尾,允许删除的一端叫队头。

单链队列的实现及操作:

1.定义一个队列

一个链队列,由每个结点连接起来。由于插入和删除是在队头和队尾进行的,我们为了方便起见,直接弄两个指针,指向头结点和队尾元素所在结点。

typedef struct QNode				 
{QElemType_L data;struct QNode *next;
}QNode;
typedef QNode* QueuePtr;
typedef struct
{QueuePtr front;				QueuePtr rear;					
}LinkQueue;	
2.构造一个空队列

我们增加一个头结点,首先分配一个头结点的内存空间。当队列为空时,队头指针和队尾指针都指向头结点,而且头结点的指针域的指针指向空,意味着队列里面没有存元素。

Status InitQueue_L(LinkQueue &Q)
{Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next = NULL;return OK;
}
3.销毁队列

这个销毁最终把头结点也给销毁了。

注意一点,链表知道头指针,就能根据->next确定后面所有结点,我们初始化增加了一个尾指针,让他指向最后一个结点,但这并不意味着我们改变了尾指针指向的位置,链表中间的结点就没了,中间的结点还是可以根据头指针和->next找到的,我们其实可以把尾指针理解成一个标记,他的位置并不影响链表,只不过方便了我们找队尾元素所在结点。真正影响链表的是我们的头指针,我们遍历也是通过头指针->next来的,每个结点都会用到。

这里我们就把尾指针当作一个转移变量来用了。先存头结点指向的下一个结点的位置,然后把头结点的位置free掉,再让头结点指向尾指针指向的位置,即将下一个结点的位置当作头结点。一路循环,当没有下一个存元素的结点了,头指针的位置指向头结点,尾指针被赋为null,头指针free之后头结点的空间也没了,然后把头指针也赋为null。最终头指针尾指针都指向null,而且所有空间全被free掉。

void DestroyQueue_L(LinkQueue &Q)
{while(Q.front){Q.rear = Q.front->next;free(Q.front);Q.front = Q.rear;	}
}

如果是清空的话,有一点不同,就是还有头结点,只不过->next指向null了,和初始状态一样,头指针,尾指针指向头结点,头结点指向下一个结点的指针指向null。这里还是把尾指针当作一个转移变量,初始指向第一个结点,每次让头指针指向的下一个结点变成尾指针这个转移变量指向的下一个结点,然后free掉尾指针原来指向的结点,然后把当前尾指针指向的结点更新为尾指针这个转移变量指向的下一个结点。举个例子即可明白。

void ClearQueue_L(LinkQueue &Q)
{Q.rear = Q.front->next;while(Q.rear){Q.front->next = Q.rear->next;		free(Q.rear);		Q.rear = Q.front->next;}Q.rear = Q.front;
}
4.插入元素e到队尾

插入元素,分配一个结点的空间,然后原尾指针的下一个位置指向新结点,更新尾指针。

Status EnQueue_L(LinkQueue &Q, QElemType_L e)
{QueuePtr p;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.删除队头元素,用e返回其值

删除先判端是否有元素,然后取出队头元素,让头结点指针域里面的指针指向的下一个结点变成第一个元素的结点指向的下一个元素的结点。

这里我们还要考虑是否对尾指针产生影响,当仅有一个元素时,删除后队列为空,尾指针应该指向头结点。

最后把删除的结点的空间释放掉即可。

Status DeQueue_L(LinkQueue &Q, QElemType_L &e)
{QueuePtr p;if(Q.front==Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if(Q.rear==p)Q.rear = Q.front;free(p);return OK;
} 

单链队列操作实例及代码:

代码:

#include<cstdio>
#include<cstdlib>#define	OK			1			
#define	ERROR		0	
#define	OVERFLOW	-2			
#define UNDERFLOW	-3	
#define	TRUE		1			
#define	FALSE		0typedef int QElemType_L;
typedef int Status;typedef struct QNode				 
{QElemType_L data;struct QNode *next;
}QNode;
typedef QNode* QueuePtr;
typedef struct
{QueuePtr front;				QueuePtr rear;					
}LinkQueue;	
Status InitQueue_L(LinkQueue &Q)
{Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next = NULL;return OK;
}
void ClearQueue_L(LinkQueue &Q)
{Q.rear = Q.front->next;while(Q.rear){Q.front->next = Q.rear->next;		free(Q.rear);		Q.rear = Q.front->next;}Q.rear = Q.front;
}
void DestroyQueue_L(LinkQueue &Q)
{while(Q.front){Q.rear = Q.front->next;free(Q.front);Q.front = Q.rear;	}
}
Status EnQueue_L(LinkQueue &Q, QElemType_L e)
{QueuePtr p;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_L(LinkQueue &Q, QElemType_L &e)
{QueuePtr p;if(Q.front==Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if(Q.rear==p)Q.rear = Q.front;free(p);return OK;
} 
void QueueTraverse_L(LinkQueue Q, void (Visit)(QElemType_L))
{QueuePtr p;p = Q.front->next;while(p){Visit(p->data);p = p->next;}printf("\n");
} 
void PrintElem(QElemType_L e)
{printf("%d ", e);
}
Status QueueEmpty_L(LinkQueue Q)
{if(Q.front==Q.rear)return TRUE;elsereturn FALSE;
} 
int main(){LinkQueue Q;int i;QElemType_L e;printf("初始化链队 Q ...\n");					 InitQueue_L(Q);printf("\n");QueueEmpty_L(Q) ? printf(" Q 为空!!\n") : printf(" Q 不为空!\n");printf("\n");for(i=1; i<=6; i++)									{printf("元素 \"%2d\" 入队,", 2*i);EnQueue_L(Q, 2*i);printf("\n");}printf("\n");printf(" Q 中的元素为:Q = ");						 QueueTraverse_L(Q, PrintElem);printf("\n");DeQueue_L(Q, e);printf("队头元素 \"%d\" 出队...\n", e);printf(" Q 中的元素为:Q = ");						 QueueTraverse_L(Q, PrintElem);printf("\n");	printf("销毁 Q 前:");Q.front!=NULL && Q.rear!=NULL ? printf(" Q 存在!\n") : printf(" Q 不存在!!\n");DestroyQueue_L(Q);printf("销毁 Q 后:");Q.front!=NULL && Q.rear!=NULL ? printf(" Q 存在!\n") : printf(" Q 不存在!!\n");printf("\n");	
}

输出:

初始化链队 Q …

Q 为空!!

元素 " 2" 入队,
元素 " 4" 入队,
元素 " 6" 入队,
元素 " 8" 入队,
元素 “10” 入队,
元素 “12” 入队,

Q 中的元素为:Q = 2 4 6 8 10 12

队头元素 “2” 出队…
Q 中的元素为:Q = 4 6 8 10 12

销毁 Q 前: Q 存在!
销毁 Q 后: Q 不存在!!

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

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

相关文章

php修改mysql数据找不到_php 如何修改mysql数据

PHP MYSQL 修改删除数据创建userinfo_update.php&#xff0c;用于查询用户信息&#xff0c;先显示信息&#xff0c;在修改&#xff1a;先通过GET获取用户编号查询用户信息&#xff1a;$sql "select * from user_info where user_id".$_GET[userId]."";$re…

人工智能训练机器人的服务器,人工智能系统教会机器人如何在荒野中行走

对救援人员和户外运动爱好者来说&#xff0c;穿越荒野小径是一项有用的技能&#xff0c;但对机器人来说却很难。这并不是说这些机械动物没有能力在爬上山坡的同时避开倒下的树枝——最先进的机器学习算法可以做到这一点。问题在于它们缺乏通用性&#xff1a;人工智能驱动的机器…

(递归)猴子吃桃

题目&#xff1a; 猴子买一堆桃不知个数&#xff0c;每天吃桃子一半多一个&#xff0c;第n天只剩一个桃&#xff0c;问一开始买了几个桃。输入整数n(2<n<30)。输出买的桃的数量。 样例输入2&#xff0c;输出4。 样例输入3&#xff0c;输出10。 分析与解答&#xff1a; …

世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文

○○脑炎康复之旅世界脑炎日病友征文2月22日是世界脑炎日(World Encephalitis Day)。2014年发起的世界脑炎日旨在致敬和鼓励全世界经历过脑炎的患者和脑炎医疗工作者。几年来&#xff0c;全球已有1.87亿人次参与世界脑炎日活动。2021年的世界脑炎日即将到来&#xff0c;今年世界…

pythoni手机版下载_Python进度栏和下载

已更新您的示例网址&#xff1a;我刚刚为此编写了一种超级简单的方法(将其略微修改)&#xff0c;以将pdfs刮出某个站点。 请注意&#xff0c;由于Powershell无法处理“ \ r”&#xff0c;因此只能在基于UNIX的系统(Linux&#xff0c;Mac OS)上正常运行import requestslink &qu…

(递归)斐波那契数列

题目 f1f21,fnafn−1bfn−2(n>2)f1f21,f_naf_{n-1}bf_{n-2}(n>2)f1f21,fn​afn−1​bfn−2​(n>2) 输入包含四个整数n(1≤n≤100),a(1≤a≤10),b(1≤a≤10),p((1≤a≤2000)。n(1\leq n \leq 100),a(1\leq a \leq 10),b(1\leq a \leq 10),p((1\leq a \leq 2000)。n(1≤…

树莓派和微信和服务器,用树莓派搭建微信公共平台

1、首先你需要一个公网ip&#xff0c; 需要做好映射&#xff0c; 把80端口映射到你的树莓派ip。2、打开你的树莓派终端&#xff0c; 创建文件夹“templates ” 和文件“weixind.py”。3、文件“weixind.py”中写入以下代码。安装“sudo apt-get install python-lxml”。5、申请…

mysql数据异常增长_mysql表到一定数据量后会异常的增长

如题InnoDB的table&#xff0c;里面的字段非常简单&#xff0c;如图中的类型才100多W的数据量&#xff0c;数据是慢慢积累起来的&#xff0c;到了最近发现涨到12G后&#xff0c;会每天成倍的增长&#xff0c;最高到达过50G&#xff0c;而数据量还是那些&#xff0c;longtext的字…

(递归)快速幂

题目 xyx^yxy当y很大&#xff0c;采用如下方式 {f(x,y2)f(x,y2),(y%20,y>0)1,y0f(x,y2)f(x,y2)x,(y%21,y>0)\left\{\begin{matrix} &amp; f(x,\frac{y}{2})\times f(x,\frac{y}{2}),(y\%20,y>0)\\ &amp; 1,y0\\ &amp; f(x,\frac{y}{2})\times f(x,\frac{y…

舰r4月28服务器维护,崩坏3 11月28日版本更新维护通知

亲爱的舰长&#xff1a;为了给舰长更好的游戏体验&#xff0c;休伯利安号将在11月28日进行版本更新维护&#xff0c;维护完成后战舰将更新为3.6版本——「绯夜霞隐」。维护时间安卓国服、iOS服和各渠道服&#xff1a;11月28日07:00~12:00全平台服(桌面服)&#xff1a;11月28日0…

ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S

EC200S 是移远通信最近推出的LTE Cat 1 无线通信模块&#xff0c;支持最大下行速率10Mbps 和最大上行速率5Mbps&#xff0c;具有超高的性价比&#xff1b;同时在封装上兼容移远通信多网络制式LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1)和EC200T/EG25-G/EG21-G 模块以…

(递归)弹簧板

题目 现在n个弹簧板&#xff0c;小球从第i个弹簧板落下&#xff0c;可以向前弹a[i-1]个距离或者b[i-1]个距离&#xff0c;现在从第一个弹簧板落下&#xff0c;计算弹多少次&#xff0c;弹出弹簧板。(1≤n≤200),(0<a[i],b[i]≤30)(1 \leq n \leq 200),(0 < a[i],b[i]\le…

maven 打包时缺少文件_maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到...

场景:因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都…

(递归)最大公约数

题目&#xff1a; f(x,y)f(x,y)f(x,y){f(y,x%y),(y>0)x,(y0)\left\{\begin{matrix} &amp; f(y,x\% y),(y>0) \\ &amp; x,(y0) \end{matrix}\right.{​f(y,x%y),(y>0)x,(y0)​ 输入&#xff1a;第一行一个整数t(t ≤100\leq 100≤100)然后有t行&#xff0c;每行…

mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字: #includest - phpStudy...

c语言标准库中字符转换函数和数字转换函数字符转换为数字&#xff1a;#includeatoi();将字符转换为整型 例&#xff1a;char ch1;int iatoi(ch1);atol();将字符转化为长整型 例&#xff1a;char ch2;long latol(ch2);atof();将字符转化为浮点型 例&#xff1a;char ch3;flo…

(栈)括号匹配

题目 一个串&#xff0c;只包含(和)。一个(能唯一匹配一个)&#xff0c;但是(必须出现在)之前&#xff0c;请判断括号能否完全匹配&#xff0c;如果能&#xff0c;输出配对的括号位置&#xff0c;匹配括号只能嵌套不能交叉。 输入&#xff1a;一个只由(和)构成的字符串&#…

mysql java文件导入导出_MySQL文件导出和导入

一、导出数据库用mysqldump命令&#xff1a;注意mysql的安装路径&#xff0c;即此命令的路径1、导出数据和表结构&#xff1a;mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql#/usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql敲回车后会提示输入密码2、只…

(栈)网页跳转

题目&#xff1a; VISIT打开界面&#xff0c;BACK回退&#xff0c;FORWARD前进。 现在输入n行&#xff0c;每行首先输入一个字符串&#xff0c;如果是VISIT&#xff0c;后面再输入一行不含空格的网址&#xff0c;如果是BACK&#xff0c;回退&#xff0c;如果是FORWARD&#xf…

vv7无法启动显示发动机故障_点火系统故障引起发动机不能启动的排除方法

点火系统故障引起发动机不能启动的排除方法a 外观检查首先察看点火线圈和b 中央高压线试火拔出分电器上的中央高压线&#xff0c;插入一个放电器(或备用火花塞)并将放电器(火花塞)搭铁&#xff0c;然后接通点火开关&#xff0c;在转动发动机时看放电器(火花塞)(汽車维修网 Http…

(vector)堆积木

题目&#xff1a; n块积木&#xff0c;编号1到n&#xff0c;初始时&#xff0c;第i块放在第i个位置。现在&#xff0c;进行a b操作&#xff0c;每次操作把b位置积木全放到a位置上。输出操作完之后每个位置上的木块。 输入:n,m。n代表有n个积木&#xff0c;m代表有m个操作&…