数据结构(C语言)代码实现(十)——链队列循环队列

目录

参考资料

链队列的实现

LinkQueue.h

LinkQueue.cpp

测试函数test.cpp

测试结果 

 

循环队列的实现(最小操作子集) 

完整代码

测试结果 


参考资料

数据结构严蔚敏版

链队列的实现

LinkQueue.h

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef char QElemType;//-----ADT Queue的表示与实现-----
//-----单链队列——队列的链式存储结构-----
typedef struct QNode{QElemType data;struct QNode* next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;//队头指针QueuePtr rear;//队尾指针
}LinkQueue;//-----基本操作的函数原型说明-----
Status InitQueue(LinkQueue& Q);
//构造一个空队列Q
Status DestroyQueue(LinkQueue& Q);
//销毁队列Q,Q不再存在
Status ClearQueue(LinkQueue& Q);
//将Q清为空队列
Status QueueEmpty(LinkQueue Q);
//若队列Q为空队列,则返回TRUE,否则返回FALSE
int QueueLength(LinkQueue Q);
//返回Q的元素个数,即为队列的长度
Status GetHead(LinkQueue Q, QElemType& e);
//若队列不空,则用e返回Q的队头元素,并返回OK;
//否则返回ERROR
Status EnQueue(LinkQueue& Q, QElemType e);
//插入元素e为Q的新的队尾元素
Status DeQueue(LinkQueue& Q, QElemType& e);
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
//否则返回ERROR
Status QueueTraverse(LinkQueue Q, Status visit(QElemType));
//从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit失败,则操作失败。

LinkQueue.cpp

#include "LinkQueue.h"//-----基本操作的算法描述-----
Status InitQueue(LinkQueue& Q) {//-----构造一个空队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front)exit(OVERFLOW);//存储分配失败Q.front->next = NULL;return OK;
}Status DestroyQueue(LinkQueue& Q) {//销毁队列Qwhile (Q.front) {Q.rear = Q.front->next;free(Q.front);Q.front = Q.rear;}return OK;
}Status ClearQueue(LinkQueue& Q) {//将Q清为空队列QElemType e;while(DeQueue(Q,e)==OK){}return OK;
}Status QueueEmpty(LinkQueue Q) {//若队列Q为空队列,则返回TRUE,否则返回FALSEif (Q.front == Q.rear)return TRUE;elsereturn FALSE;
}int QueueLength(LinkQueue Q) {//返回队列长度int n = 0;QueuePtr p = Q.front;while (p != Q.rear) {p = p->next;n++;}return n;
}Status GetHead(LinkQueue Q, QElemType& e) {if (Q.front == Q.rear)return ERROR;e = Q.front->next->data;return OK;
}Status EnQueue(LinkQueue& Q, QElemType e) {//插入元素e为Q的新的队尾元素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) {//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;//否则返回ERRORif (Q.front == Q.rear)return ERROR;//Q.front->next==NULL;也行QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front;//队列为空时将尾指针重置free(p);return OK;
}Status QueueTraverse(LinkQueue Q, Status visit(QElemType)) {if (Q.front == Q.rear) {printf("队列为空\n");return OK;}QueuePtr p = Q.front->next;while (p) {visit(p->data);p = p->next;}printf("\n");return OK;
}

测试函数test.cpp

#include "LinkQueue.h"Status visit(QElemType m) {printf(" %c", m);return OK;
}int main()
{LinkQueue Q;QElemType e;Status i;int w = 65;i = InitQueue(Q);if (i)printf("已创建队列!\n");for (int j = 0;j <= 5;j++)EnQueue(Q, w + j);QueueTraverse(Q, visit);GetHead(Q,e);printf("队列头元素:%c\n", e);ClearQueue(Q);if (QueueEmpty(Q) == TRUE)printf("队列已清空!\n");elseprintf("队列未清空!\n");DestroyQueue(Q);return 0;
}

测试结果 

 

循环队列的实现(最小操作子集) 

完整代码

#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef char QElemType;//-----循环队列——队列的顺序存储结构-----
#define MAXQSIZE 5 //最大队列长度,便于测试
typedef struct {QElemType* base;//初始化的动态分配存储空间int front;      //头指针,若队列不空,指向队列头元素int rear;       //尾指针。若队列不空,指向队列尾元素的下一个位置
}SqQueue;//-----循环队列的基本操作的算法描述-----
Status InitQueue(SqQueue& Q) {//构造一个空队列QQ.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));if (!Q.base)exit(OVERFLOW);//存储分配失败Q.front = Q.rear = 0;return OK;
}int QueueLength(SqQueue Q) {//返回Q的元素个数,即队列长度return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}Status EnQueue(SqQueue& Q, QElemType e) {//插入元素e为Q的新的队尾元素if ((Q.rear + 1) % MAXQSIZE == Q.front)return ERROR;//队列满Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXQSIZE;return OK;
}Status DeQueue(SqQueue& Q, QElemType& e) {//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;//否则返回ERROR。if (Q.front == Q.rear)return ERROR;e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXQSIZE;return OK;
}int main()
{SqQueue Q;QElemType e=65;Status i;InitQueue(Q);for (int j = 0;j < 7;j++){i = EnQueue(Q, e + j);if (i)printf("元素%c已成功入队列!\n",e + j);elseprintf("队列已满!\n");}for (int j = MAXQSIZE;j > 0;j--){i = DeQueue(Q, e);if (i)printf("元素%c已成功出队列!\n",e);elseprintf("队列已空!\n");}free(Q.base);return 0;
}

测试结果 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

到底用不用取地址符,用了有啥区别嘛

一段代码解释&#xff1a; #include <iostream> using namespace std; void swap1(int &a,int &b){int t;ta;ab;bt; } void swap2(int a,int b){int t;ta;ab;bt;cout<<"Im the answer of swap2 : "<<a<<" "<<b<…

【软考-高级软件工程师-信息系统项目管理师】 第三章 信息系统治理知识点 【五分钟看懂】

IT治理用于描述组织在信息化建设和数字化转型过程中是否采用有效的机制使得信息技术开发利用能够完成组织赋予它的使命。IT治理的核心是关注IT定位和信息化建设与数字化转型的责权利划分。 1、IT 治理体系的具体构成包括 IT 定位&#xff1a; IT 应用的期望行为与业务目标一致…

SAP FICO 更改已有业务数据的成本中心公司代码/业务范围

如果对已经发生业务数据的成本中心进行公司代码/业务范围修改&#xff0c;系统会报错&#xff0c;如下图所示 可参考SAP note 62716 - KS020 for change of company code, business area进行解决 解决办法&#xff1a; KS02修改成本中心描述 如下图所示会有一个新的期间&…

【深度学习】SDXL-Lightning 体验,gradio教程,SDXL-Lightning 论文

文章目录 资源SDXL-Lightning 论文 资源 SDXL-Lightning论文&#xff1a;https://arxiv.org/abs/2402.13929 gradio教程&#xff1a;https://blog.csdn.net/qq_21201267/article/details/131989242 SDXL-Lightning &#xff1a;https://huggingface.co/ByteDance/SDXL-Light…

不会这个技巧,你敢说你会经营食堂?

随着科技的不断发展&#xff0c;智能化技术已经深刻改变了各行各业的运作方式&#xff0c;其中餐饮行业也在迎来数字化转型的浪潮。 在这个信息时代&#xff0c;智慧收银系统作为餐饮管理的重要工具&#xff0c;正在逐渐成为提升运营效率、优化用户体验的关键利器。 客户案例 …

基于uniapp电影院购票售票选座系统php/python/nodejs微信小程序_kfsf4

对一些已有的订票系统的设计与实现进行分析研究&#xff0c;寻找规律或产生问题的根源&#xff0c;进而寻求解决问题或改进的方法&#xff0c;形成新的研究课题。 研究步骤 1、图书馆查阅相关资料 2、进行系统功能需求分析 3、根据系统功能需求分析文档绘制系统功能模块图和操作…

Java Web(八)--Servlet(二)

Servlet API Servlet API 包含以下4个Java包&#xff1a; 1. javax.servlet&#xff1a;其中包含定义Servlet和Servlet容器之间契约的类和接口。 2. javax.servlet.http&#xff1a;主要定义了与HTTP协议相关的HttpServlet类&#xff0c;HttpServletRequest接口和HttpServl…

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

CANoe学习笔记--MeasurementSetup的配置和使用

CANoe提供了一种非常特殊的数据分析模式&#xff0c;即基于数据流方向的测量和分析。MeasurementSetup也是基于图形化的设置模式&#xff0c;能够让工程人员一目了然。 如何理解“基于数据流方向的图形化配置”看下图 数据是像流水一样&#xff0c;定向的向左移动&#xff0c;…

SSP-RCP情景下全球1-km分辨率土地利用预测数据集(2020-2100)【耕地、林地、草地、城乡、工矿、居民用地、未利用地、水体】

作者基于ESA-CCI历史土地利用数据&#xff0c;使用GCAM模型估算了未来土地利用面积需求&#xff1b;然后采用一种改进的元胞自动机模型PLUS对需求进行高空间分辨率降尺度迭代模拟&#xff0c;得到SSP-RCP情景下全球1-km分辨率土地利用预测数据集&#xff08;2020-2100&#xff…

Ubuntu18.04 系统上配置并运行SuperGluePretrainedNetwork(仅使用CPU)

SuperGlue是Magic Leap在CVPR 2020上展示的研究项目&#xff0c;它是一个图神经网络&#xff08;Graph Neural Network&#xff09;和最优匹配层&#xff08;Optimal Matching layer&#xff09;的结合&#xff0c;训练用于对两组稀疏图像特征进行匹配。这个项目提供了PyTorch代…

【pytorch】函数记录

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

自主web服务器实现

目录 项目背景网络协议栈协议分层数据封装与分用 HTTP协议介绍HTTP协议简介认识URLURI、URL、URNHTTP的五大特点HTTP协议格式HTTP的请求方法HTTP的状态码HTTP常见的Header CGI机制介绍CGI机制概念CGI模式实现步骤CGI机制的流程 日志文件编写套接字相关代码编写HTTP服务器的主体…

Kotlin:协程基础

点击查看&#xff1a;协程基础 中文文档 点击查看&#xff1a;协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 &#xff0c;它不会造成线程阻塞&#xff0c;但是会 挂起 协程&…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

代码随想录算法训练营day24

题目&#xff1a;77. 组合 参考链接&#xff1a;代码随想录 回溯法理论基础 回溯三部曲&#xff1a;回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

【算法与数据结构】复杂度深度解析(超详解)

文章目录 &#x1f4dd;算法效率&#x1f320; 算法的复杂度&#x1f320; 时间复杂度的概念&#x1f309;大O的渐进表示法。 &#x1f320;常见复杂度&#x1f320;常见时间复杂度计算举例&#x1f309;常数阶O(1)&#x1f309;对数阶 O(logN)&#x1f309;线性阶 O(N)&#x…

选择排序的简单介绍

选择排序是一种简单直观的排序算法&#xff0c;其原理如下&#xff1a; 1. 遍历数组&#xff0c;找到最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其与数组的第一个元素交换位置。 2. 接着在剩下的元素中找到最小&#xff08;或最大&#xff09;的元素&#xff…

图论-算法题

797. 所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i …

Openstack云计算架构及前期服务搭建

openstack介绍 Openstack是一个开源的云计算管理平台项目&#xff0c;由几个主要的组件组合起来完成具体工作&#xff0c;支持几乎所有的云环境&#xff0c;项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台 ----百度百科 Openstack是一个云操作系统&a…