数据结构与算法--用c语言建立队列以及其相关操作

2023-11-20

一.队列的定义和特点

队列与栈一样,也是一种特殊的线性表,与栈”先进后出“不同的是,队列服从“先进先出”,也就是元素从队尾进入队列,从队头离开,如图所示:在这里插入图片描述

a1最先进入队列,因此最先从对头离开队列,然后是a2,以此类推。

二.队列的相关操作及其代码

队列同意分为顺序队列和链式队列,因链式队列使用较多,在此我将以链式队列--银行排队系统作为演示

1.队列的建立(初始化)

首先定义一个结构体变量用来存放队列结点的数据和指向下一个结点的指针,并且申请一个新的结点作为头节点,使其的指针指向空,代码如下:

struct people{
	char name[5];
	struct people *next;
};

int m = 0,n = 0;        //用来记录目前排队人数和总人数

struct people *creat()
{
	struct people *head;
	head = new people;
	head->next = NULL;
	printf("创建队列成功!\n");
	return head;
}

2.入队列操作

申请一个新结点,存入数据,再将此结点接入队列的末尾,即使上一个结点的指针指向新结点,代码如下:

void enter(struct people *head)
{
	struct people *p1,*p2;
	p1 = head;
	while(p1->next != 0)
	{
		p1 = p1->next;
	}
	p2 = new people;
	printf("请输入排队人的姓名:\n");
	scanf("%s",&p2->name);
	p1->next = p2;
	p2->next = NULL;
	printf("进入队列成功!\n");
	n++;       //总人数加一 
	m++;       //队列中现有人数加一
}

3.出队列操作

头结点之后的结点出队列(头结点中不存放数据),即将头结点的next指针指向第二个结点,释放掉第一个结点,代码如下:

void leave(struct people *head)
{
	struct people *p1,*p2;
	if(head->next == NULL)        //若队列为空,则直接跳出
	{
		printf("该队列没有人!\n");
		return;
	}
	p1 = head->next;
	p2 = p1->next;
	head->next = p2;
	free(p1);
	printf("离开队列成功!\n");
	m--;        //现队列人数减一
}

4.打印队列中的元素

将队列中的数据从队头开始显示到屏幕上,代码如下:

void print(struct people *head)
{
	struct people *p;
	p = head;
	if(p->next == NULL)        //若队列没有元素,则直接跳出
	{
		printf("该队列没有人!\n");
		return;
	}
	printf("当前排队情况为:\n");
	do
	{	
		p = p->next;
		printf("%s ",p->name);
	}while(p->next != 0);
	printf("\n");
}

完整代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct people{
	char name[5];
	struct people *next;
};

int n = 0,m = 0;

struct people *creat()
{
	struct people *head;
	head = new people;
	head->next = NULL;
	printf("创建队列成功!\n");
	return head;
}

void enter(struct people *head)
{
	struct people *p1,*p2;
	p1 = head;
	while(p1->next != 0)
	{
		p1 = p1->next;
	}
	p2 = new people;
	printf("请输入排队人的姓名:\n");
	scanf("%s",&p2->name);
	p1->next = p2;
	p2->next = NULL;
	printf("进入队列成功!\n");
	n++;
	m++;
}

void leave(struct people *head)
{
	struct people *p1,*p2;
	if(head->next == NULL)
	{
		printf("该队列没有人!\n");
		return;
	}
	p1 = head->next;
	p2 = p1->next;
	head->next = p2;
	free(p1);
	printf("离开队列成功!\n");
	m--;
}

void print(struct people *head)
{
	struct people *p;
	p = head;
	if(p->next == NULL)
	{
		printf("该队列没有人!\n");
		return;
	}
	printf("当前排队情况为:\n");
	do
	{	
		p = p->next;
		printf("%s ",p->name);
	}while(p->next != 0);
	printf("\n");
}

int main()
{
	int a;
	struct people *str;
	
	printf("欢迎进入银行排队系统:\n1.创建队列\n2.进入队列\n3.离开队列\n4.查询前面的客户\n5.查询办理总人数\n6.退出系统\n");
	printf("请输入:\n");
	scanf("%d",&a);
	while(a != 6)
	{
		switch(a)
		{
			case 1:{
				str = creat();
				break;
			}
			case 2:{
				enter(str);
				print(str);
				break;
			}
			case 3:{
				leave(str);
				print(str);
				break;
			}
			case 4:{
				printf("前面还有%d位客户\n",m);
				break;
			}
			case 5:{
				printf("银行今日共接待了%d位客户\n",n);
				break;
			}
		}
		printf("请输入:\n");
		scanf("%d",&a);	
	}
}

三.总结

队列在实际生活中应用非常广泛,并且个人认为,链式结构的队列比顺序结构的队列要更加实用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法--用c语言建立队列以及其相关操作 的相关文章

  • PDH光端机技术与应用:稳定可靠的数据传输解决方案

    在当今数字化 网络化日益加速的世界中 数据传输的稳定性和可靠性至关重要 PDH Plesiochronous Digital Hierarchy 准同步数字系列 光端机技术 作为早期的数字传输系统之一 虽然已被更先进的SDH Synchro
  • 网络安全现状:揭秘白帽黑客的真实收入

    前言 作为一个网络安全行业五年打工仔 今天就来看看黑客的收入和方向怎么样 一个黑客年薪是多少呢 外界普遍认为黑客是高收入群体 那么你想过黑客是怎么获得收入的吗 黑客分为白帽黑客和黑帽黑客 处于黑白两道的黑客会的技术都有些相似 但是却是对立的
  • 一个网工(网络工程师)七年的职业血泪史....

    前言 一个工作了七年的老网工 上家公司待了五年 现在这家公司也快三年了 分享一些我自己学习网络安全路上的一些经历 也算是帮大家少走些弯路 一 如何学习网络安全 1 不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全 一般
  • 网络基础面试题(二)

    11 什么是网桥 防火墙的端口防护是指什么 网桥是一种网络设备 用于连接两个或多个局域网 LAN 并转发数据包 它能够根据MAC地址来识别和转发数据 提高网络的传输效率和安全性 防火墙的端口防护是指对防火墙上的各个端口进行保护和限制 只允许
  • 如何使用内网穿透实现iStoreOS软路由公网远程访问局域网电脑桌面

    文章目录 简介 一 配置远程桌面公网地址 二 家中使用永久固定地址 访问公司电脑 具体操作方法是 简介 软路由 是PC的硬件加上路由系统来实现路由器
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • 5个步骤,教你瞬间明白线程和线程安全

    记得今年3月份刚来杭州面试的时候 有一家公司的技术总监问了我这样一个问题 你来说说有哪些线程安全的类 我心里一想 这我早都背好了 稀里哗啦说了一大堆 他又接着问 那你再来说说什么是线程安全 然后我就GG了 说真的 我们整天说线程安全 但是对
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 【网安神器篇】——WPScan漏洞扫描工具

    目录 一 Wordpress简介 二 WPScan介绍 三 安装 四 获取token 1 注册账号 2 拿到token 五 使用教程 1 常用选项 2 组合命令 1 模糊扫描 2 指定扫描用户 3 插件漏洞扫描 4 主题漏洞扫描 5 Tim
  • HPE Aruba Networking:五大网络现代化策略助力实现校园数字化转型

    作者 Aruba中国区技术销售总监 俞世丹 全球数字化进程日益加深 科技已成为加速教育行业发展的重要驱动力 人工智能 大数据 云计算 物联网 虚拟现实等新兴技术的快速发展 正在深刻改变着教育的形态和模式 为了更好地满足学校师生个性化教育教学
  • tcpdump抓包

    tcpdump抓包 基本概念 1 类型的关键字 host 指明一台主机 如 host 10 1 110 110 net 指明一个网络地址 如 net 10 1 0 0 port 指明端口号 如 port 8090 2 确定方向的关键字 sr
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • 通过多点连接发送和接收邀请

    我知道这个问题之前已经被问过 但我只是想知道为什么它在我的特定情况下不起作用 我正在尝试从一个视图控制器的多点连接发送邀请 并在另一个视图控制器上接收它 我的发送代码是 self invitePeer selectedPeerID toSe
  • NAT后的两个节点如何通信?

    我有一些节点 每个节点都属于其他网络 每个节点都有私有IP 例如192 168 0 2并保持在 NAT 之后 节点之间是否有可能进行通信 实际上 我需要在这些独立节点之间传输文件 我尝试使用这个项目 https github com lib
  • WCF 是否支持点对点实现?

    我正在尝试在 LAN 内实现点对点消息传递和文件共享实用程序 那么 WCF 支持 p2p 吗 有人尝试过通过 WCF 进行文件共享吗 是的 它确实 请参见如何在对等网络中设计状态共享 http msdn microsoft com en u
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • 智能手机可以通过 3G/4G 进行点对点通信吗?

    我正在尝试编写一个应用程序 将数据从一个 Android 设备传输到另一个 Android 设备 但这些设备很可能位于城市 州或国家的不同部分 直接的方法是拥有一台中央服务器 或任何类型的服务器 但我试图避免使用中央服务器 我试图传递的数据
  • C# P2P聊天应用程序设计

    我想创建一个不使用显式服务器的简单聊天应用程序 主要要求是用户可以同时与许多朋友聊天 就像在 Skype 等上一样 我在这里指的不是会议聊天 而是多个单独的聊天窗口 目前 我只想要一个 LAN 消息应用程序 但如果设计能够轻松扩展到 Int

随机推荐