数据结构与算法--用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语言建立队列以及其相关操作 的相关文章

  • 电商数据接口API深度解析

    随着电子商务的快速发展 电商平台之间的竞争也日益激烈 为了在市场中保持领先地位 电商平台需要不断地优化用户体验 提供个性化的服务和精准的推荐 而这一切都离不开数据 电商数据接口API作为一种高效 便捷的数据交互方式 被广泛应用于电商领域 本
  • 网络安全现状:揭秘白帽黑客的真实收入

    前言 作为一个网络安全行业五年打工仔 今天就来看看黑客的收入和方向怎么样 一个黑客年薪是多少呢 外界普遍认为黑客是高收入群体 那么你想过黑客是怎么获得收入的吗 黑客分为白帽黑客和黑帽黑客 处于黑白两道的黑客会的技术都有些相似 但是却是对立的
  • 通过一个寒假能学会黑客技术吗?看完你就知道了

    一个寒假能成为黑客吗 资深白帽子来告诉你 如果你想的是学完去美国五角大楼内网随意溜达几圈 想顺走一点机密文件的话 劝你还是趁早放弃 但是成为一名初级黑客还是绰绰有余的 你只需要掌握好渗透测试 Web安全 数据库 搞懂web安全防护 SQL注
  • 一个网工(网络工程师)七年的职业血泪史....

    前言 一个工作了七年的老网工 上家公司待了五年 现在这家公司也快三年了 分享一些我自己学习网络安全路上的一些经历 也算是帮大家少走些弯路 一 如何学习网络安全 1 不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全 一般
  • 浅谈能耗系统在马来西亚连锁餐饮业的应用

    1 背景信息 Background 针对连锁餐饮业能耗高且能源管理不合理的问题 利用计算机网络技术 通讯技术 计量控制技术等信息化技术 实现能源资源分类分项计量和能源资源运行监管功能 清晰描述各分店总的用能现状 实时监测各供电回路的电压 电
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • Python爬虫实战:IP代理池助你突破限制,高效采集数据

    当今互联网环境中 为了应对反爬虫 匿名访问或绕过某些地域限制等需求 IP代理池成为了一种常用的解决方案 IP代理池是一个包含多个可用代理IP地址的集合 可以通过该代理池随机选择可用IP地址来进行网络请求 IP代理池是一组可用的代理IP地址
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 揭秘网络世界的幕后密码——Wireshark网络协议分析软件

    在我们日常生活中 计算机和互联网已经成为不可或缺的一部分 然而 很少有人真正了解网络背后复杂的工作原理和通信协议 幸运的是 有一款强大而实用的软件 Wireshark 可以帮助我们深入了解网络世界的幕后密码 Wireshark是一款免费的网
  • 【无标题】

    大家都知道该赛项的规程和样题向来都是模棱两可 从来不说具体的内容 导致选手在备赛时没有头绪 不知道该怎么训练 到了赛时发现题目和备赛的时候完全不一样 那么本文将以往年信息安全管理与评估赛项经验来解读今年2023年国赛的规程 帮助选手们指明方
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
  • 通过多点连接发送和接收邀请

    我知道这个问题之前已经被问过 但我只是想知道为什么它在我的特定情况下不起作用 我正在尝试从一个视图控制器的多点连接发送邀请 并在另一个视图控制器上接收它 我的发送代码是 self invitePeer selectedPeerID toSe
  • 如何在两个设备(android,iphone)之间传输“数据”?

    如何在两个设备之间传输数据 我想在不同平台 android iphone 之间传输数据 主要是图像文件 是否可以使用 p2p 或者我应该使用客户端服务器 任何帮助将不胜感激 你看过吗高通的 AllJoyn 库 https developer
  • “dat”协议能否有效支持视频直播?

    我希望能够通过以下方式实时流式传输视频 或任何其他大型且不断修改 附加的文件 dat Here https github com beakerbrowser webdb performance它说 dat 协议不支持文件级别的部分更新 这意
  • 比特币客户端如何确定第一个连接的IP地址?

    据我所知 比特币是一种 p2p 协议P2P协议必须有一个专用的中央服务器 https stackoverflow com questions 310607 peer to peer methods of finding peers 但据说比
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600

随机推荐