数据结构实验 6 链队的实现

编写一个程序,实现链队的各种基本运算 完成如下功能: (1)初始化链队q; (2)判断链队q是否非空; (3)依次进队元素a,b,c; (4)出队一个元素,并输出该元素; (5)输出链队q的元素个数; (6)依次进链队元素d,e,f; (7)输出链队q的元素个数; (8)输出出队序列; (9)释放链队; 代码: #include"iostream" using namespace std; c 阅读详情

一、实验目的

1. 掌握队列的链式存储及初始化、创建、求长、销毁、入队、出队等基本操作。

2. 使用C/C++写出链式队列。

3. 了解队列相较于顺序表的特殊性,能在不同情况下选择合适的存储方式。

二、实验要求

1.写出链式队列存储及详细算法步骤;

三、实验过程

实验环境:visual studio 2017

实验步骤:

1. 初始化链队Q,定义函数名为Init_LQueue;

2. 创建链队Q,定义函数名为Create_LQueue;

3. 求链队Q的长度(元素个数),定义函数名为Length_LQueue;

4. 打印链队Q,定义函数名为Print_LQueue;

5. 销毁链队Q,定义函数名为Destory_LQueue;

6. 元素入队,定义函数名为Enqueue;

7. 元素出队,定义函数名为Dequeue;

LQueue.h

#define ELEMTYPE int   //定义一个标识符来表示链队数据的类型
#include<stdio.h>      //调用头文件
#include<stdlib.h>     //调用头文件

typedef struct DataNode     //构建结构体变量存储链队数据相关信息
{
	ELEMTYPE data;          //存放元素
	struct DataNode* next;		//后继结点指针
}DataNode,*Queue;   //DataNode为结构体类型别名,Queue为结构体指针

typedef struct QueueNode		//构建结构体变量存储链队结点相关信息
{
	DataNode* front;			//队头指针
	DataNode* rear;				//队尾指针
}QueueNode;						//结构名为QueueData

void Init_LQueue(Queue* Q,QueueNode* P);						//声明初始化函数——Init_LQueue
void Create_LQueue(Queue* Q,QueueNode* P);					//声明创建函数——Create_LQueue
int Length_LQueue(Queue Q);					//声明求长函数——Length_LQueue
void Print_LQueue(Queue Q);						//声明打印函数——Print_LQueue
void Destory_LQueue(Queue* Q,QueueNode* P);					//声明销毁函数——Destory_LQueue
void Enqueue(QueueNode*P, ELEMTYPE e);				//声明入队函数——Enqueue
void Dequeue(Queue* Q, QueueNode*P, ELEMTYPE* e);				//声明出队函数——Dequeue

LQueue.c

#include "LQueue.h"		//调用头文件

void Init_LQueue(Queue* Q,QueueNode* P)		//初始化链队Q
{
	P = (QueueNode*)malloc(sizeof(QueueNode));		//用malloc给P分配一块内存
	(*Q) = (Queue)malloc(sizeof(DataNode));		//用malloc给链队Q分配一块内存
	P->rear = P->front = (*Q)->next = NULL;	//队头指针、队尾指针和头结点的指针域置为空
}

void Create_LQueue(Queue* Q,QueueNode* P)		//创建链队Q
{
	int length;    //定义整型变量length表示链队Q队长
	printf("Please input the length:");    //提示输入队长length
	scanf("%d", &length);    //输入队长length
	P->rear = (*Q);         //队尾指针指向头结点
	for (int n = 1; n <= length; n++)    //向链队Q中添加n个数据
	{
		DataNode* p;    //定义结构体指针类型变量p
		p = (DataNode*)malloc(sizeof(DataNode));    //用malloc给p分配一块内存
		printf("Please input the data:");    //提示输入结点p的数据域
		scanf("%d", &p->data);    //输入结点p的数据域
		p->next = NULL;				//此时p为尾结点,所以p的指针域置为空
		P->rear->next = p;			//原尾结点的指针域指向当前尾结点
		P->rear = p;				//队尾指针指向当前尾结点p
	}
	P->front = (*Q)->next;			//队头指针指向首元结点
}

int Length_LQueue(Queue Q)			//求链队长度
{
	DataNode* p = Q;    //定义结构体指针类型变量p
	int length = 0;		//定义整型变量length计数
	while (p->next != NULL)			//当p的后继结点不为空(即p不是尾结点)时执行循环
	{
		p = p->next;				//p向后挪动,为原来p的后继结点
		length++;					//计数加1
	}
	return length;				//返回链队长度
}

void Print_LQueue(Queue Q)
{
	DataNode* p = Q;    //定义结构体指针类型变量p
	printf("This Queue is:");       //提示打印队列
	while (p->next != NULL)			//当p的后继结点不为空(即p不是尾结点)时执行循环
	{
		p = p->next;				//p向后挪动,为原来p的后继结点
		printf("%d ", p->data);		//打印p的数据域
	}
	printf("\n");					//换行
}

void Destory_LQueue(Queue* Q, QueueNode* P)
{
	DataNode* p = (*Q),*q;    //定义结构体指针类型变量p,q
	while (p->next != NULL)			//当p的后继结点不为空(即p不是尾结点)时执行循环
	{
		q = p;						//q存储当前结点p
		p = p->next;				//p向后挪动,为原来p的后继结点
		free(q);					//释放原来结点p的空间
		q = NULL;					//原来结点p置为空(防止出现悬空指针)
	}
	free(Q);						//释放链队Q的空间
	free(P);						//释放P的空间
	Q = NULL;						//Q置为空
	P = NULL;						//P置为空
}

void Enqueue(QueueNode* P, ELEMTYPE e)			//将元素e入队
{
	DataNode* p;								 //定义结构体指针类型变量p
	p = (DataNode*)malloc(sizeof(DataNode));		//用malloc给p分配一块内存
	p->data = e;							//将元素e赋值给p的数据域
	p->next = NULL;							//p为尾结点,所以指针域为空
	P->rear->next = p;						//将p链接入队列
	P->rear = p;							//更新尾结点
}

void Dequeue(Queue* Q, QueueNode*P, ELEMTYPE* e)				//将首元结点出队
{
	if (Length_LQueue(*Q) == 0)					//判断队列为空
	{
		printf("Dequeue falied.\n");			//提示出队失败
		return;									//退出函数
	}
	else										//队列不为空
	{
		*e = P->front->data;					//取出原首元结点数据域
		(*Q)->next = P->front->next;			//更新首元结点
		P->front = (*Q)->next;					//更新队头指针
	}
}

Test_Init_Create_Print.c

#include "LQueue.h"				//调用头文件

int main(void)					//main()函数
{
	Queue Q;					//定义结构体指针变量Q
	QueueNode P;				//定义结构体变量P
	Init_LQueue(&Q, &P);		//调用Init_LQueue函数将链队Q初始化
	Create_LQueue(&Q, &P);		//调用Create_LQueue函数创建链队Q
	Print_LQueue(Q);			//调用Print_LQueue函数打印链队Q
	return 0;					//返回值
}

Test_Length.c

#include "LQueue.h"				//调用头文件

int main(void)					//main()函数
{
	Queue Q;					//定义结构体指针变量Q
	QueueNode P;				//定义结构体变量P
	Init_LQueue(&Q, &P);		//调用Init_LQueue函数将链队Q初始化
	Create_LQueue(&Q, &P);		//调用Create_LQueue函数创建链队Q
	printf("This queue's length is:%d\n",Length_LQueue(Q));			//调用Length_LQueue函数打印链队Q长度
	return 0;					//返回值
}

Test_Enqueue.c

#include "LQueue.h"				//调用头文件

int main(void)					//main()函数
{
	Queue Q;					//定义结构体指针变量Q
	QueueNode P;				//定义结构体变量P
	Init_LQueue(&Q, &P);		//调用Init_LQueue函数将链队Q初始化
	Create_LQueue(&Q, &P);		//调用Create_LQueue函数创建链队Q
	Print_LQueue(Q);			//调用Print_Lqueue函数打印链队Q
	ELEMTYPE e;     //定义待入队元素e
	printf("The element to be enqueue is:"); //提示输入待入队的元素
	scanf("%d", &e);    //输入待入队的元素
	Enqueue(&P,e);				//调用Enqueue函数将元素e入队
	Print_LQueue(Q);			//调用Print_LQueue函数打印链队Q
	return 0;					//返回值
}

Test_Dequeue.c

#include "LQueue.h"				//调用头文件

int main(void)					//main()函数
{
	Queue Q;					//定义结构体指针变量Q
	QueueNode P;				//定义结构体变量P
	Init_LQueue(&Q, &P);		//调用Init_LQueue函数将链队Q初始化
	Create_LQueue(&Q, &P);		//调用Create_LQueue函数创建链队Q
	Print_LQueue(Q);			//调用Print_LQueue函数打印链队Q
	ELEMTYPE e = 0;     //定义待入队元素e
	Dequeue(&Q, &P, &e);				//调用Enqueue函数将元素e入队
	Print_LQueue(Q);			//调用Print_LQueue函数打印链队Q
	return 0;					//返回值
}

四、实验结果及分析

测试函数

测试用例

运行结果

Init_LQueue Creat_LQueue

Print_LQueue

5

1,2,3,4,5

Please input the length:5

Please input the data:1

Please input the data:2

Please input the data:3

Please input the data:4

Please input the data:5

This queue is:1 2 3 4 5

0

Please input the length:0

This queue is:

Length_LQueue

5

1,2,3,4,5

This queue's length is:5

0

This queue's length is:0

Enqueue

5

1,2,3,4,5

6

The element to be enqueue is:6

This Queue is:1 2 3 4 5 6

Dequeue

5

1,2,3,4,5

This Queue is:2 3 4 5

0

Dequeue falied.

This Queue is:

C语言中队列的链式表示和实现,链队列 这个程序包括构建空队列,插入元素,删除元素,销毁队列,显示元素等功能。 立即下载

相关推荐

线性表的顺序和链式实现及其应用实验报告

数据结构《线性表的顺序和链式实现及其应用》的实验报告,比较详细|

【数据结构】线性表(九)队列:链式队列及其基本操作(初始化、判空、入队、出队、存取队首元素)

本文实现了一个基本的链式队列,主要包括队列的初始化、判空、入队、出队和获取队首元素等操作。

天地玄黄 魑魅魍魉 风花雪月 商角徵羽 2052

深入解析SerDes系统中的时钟数据恢复电路(CDR)——基于Cadence的PLL/Bang-Bang/PS-PI架构实现与仿真

本文深入解析SerDes系统中的时钟数据恢复电路(CDR),重点探讨基于Cadence平台的PLL、Bang-Bang和PS-PI三种架构的实现与仿真。通过详细的技术对比和工程实践案例,揭示CDR在高速串行通信中的关键作用,并提供TSMC 28nm工艺下的优化策略与故障排查经验,助力工程师应对10Gbps以上SerDes设计挑战。

weixin_29202687的博客 249

队列的链式表示和实现(C语言)

队列(Queue)是一种基本的数据结构,它可以存储一系列元素,并支持在队尾添加元素,在队首移除元素,遵循先进先出(FIFO)的原则。链表队列是一种基于链表实现的队列,它可以更好地适应动态添加和删除元素的情况,并且不需要事先指定队列大小。链表队列在计算机科学中有着广泛的应用,例如网络编程中的请求调度,操作系统中的进程调度等。

qq_73884528的博客 1055

整合Springboot+MybatisPlus+达梦数据库

整合Springboot+MybatisPlus+达梦数据库,以及一些坑

波波的博客 6677

Design Compiler时序约束实战:如何用set_clock_uncertainty解决时钟抖动问题?

本文深入探讨了在Design Compiler时序约束实战中,如何精准运用set_clock_uncertainty命令解决时钟抖动等非理想性问题。文章详细解析了该命令在时钟树综合前后的不同应用策略、建立时间与保持时间的差异化设置,并对比了其与set_clock_jitter的适用场景,旨在帮助数字IC设计工程师制定稳健的时序约束,为后端物理实现预留合理的安全裕量,从而高效达成时序收敛。

weixin_29196891的博客 299

数据结构-队列的相关操作

数据结构-队列的相关操作(链式队列、循环队列)

qq_62023949的博客 828

STM32 伺服电机 指令脉冲+方向位置控制模式 主从定时器 实现PWM脉冲数精确控制

实验室有个项目涉及到多个步进电机以及伺服电机的控制,需要电机得到一个触发信号后精确移动一段距离。 下面以单个伺服电机控制为例,利用伺服电机的指令脉冲加方向位置控制模式实现jing'que ...

phcdd的博客 2万+

第七周实践项目2--建立链队算法库

问题及代码: /* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第7周项目2--建立链队算法库.cpp 作 者:朱振华 完成日期:2015年10月19日 版 本 号:v1.0 问题描述:定义链队存储结构,

TonyABu的博客 805

Windows Server+SqlServer Always On实战:5步搞定高可用集群搭建

本文详细介绍了在Windows Server环境中,通过5个关键步骤搭建SQL Server Always On高可用集群的实战指南。内容涵盖从底层故障转移集群配置、SQL Server实例启用Always On功能,到创建可用性组和侦听器的完整流程,并提供了核心运维与故障排查思路,帮助企业构建稳定可靠的数据库高可用架构。

milk5的博客 857

STM32学习笔记 二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

系列文章目录 一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 文章目录系列文章目录前言一、配置CubeMX二、逻辑代码部分 前言 这次我用的板子是一个用STM32F103C8T6作为主控芯片的一个数据采集卡,两个LED灯连接的引脚是PB3与PB4,TX与RX引脚分别是PA9和PA10。 一、配置CubeMX 1、新建工程; 2、配置时钟源,在RCC里面的HSE配置的是晶振时钟; 3、配置程序烧录引脚SYS为SWD模式; 4、配置GPIO口,配置一个LE

遗忘丶的博客 1万+

C语言 队列的链式结构的实现与表示 数据结构 队列的实现与表示

  五一放假,也没有什么事情可以做的,本来想出去玩一玩或者打打球什么的,可是天公不作美,这两天天气一直是在下雨,弄的人的心情湿透了。 昨天学习了一天的栈和队列,昨天在下午些的时候完成了栈的编程工作。晚上本应该是用来写完队列的程序的,可是晚上到寝室熄灯之前只是差一点程序就可以全部完工了,可是总是有几个小bug调试不过去。没办法,今天上午又花了一个小时才完工。 艾,不过总算写完了,对于数据结构

yijiyong100的专栏 1865

【Flink】Flink提交任务到Yarn报错Unable to close file because the last blockBP enough number of replicas

当使用 HDFS 存储文件时,每个数据块会有多个副本分布在不同的节点上,以确保数据的可靠性和容错性。然而,由于某种原因,最后一个数据块 blk_1101776325_28036289 的副本数量不足,导致无法成功关闭文件。如果确定副本数量正确,并且问题仍然存在,可以尝试手动修复副本不足的情况。异常消息表明在关闭文件时出现问题,我的原因是hadoop上有个节点有问题,导致提交到那个节点的时候,无法传递包到相关的机器上。检查 HDFS 集群的状态,确保所有节点都正常工作,没有节点宕机或网络故障等问题。

九师兄 934

数据结构学习笔记——链式存储结构实现队列(链队)

在链队中,队头指针指向队头结点,队尾指针指向队尾结点,由于不带头结点的链队操作较为麻烦,一般将链队设置为,带头结点的链式队列如下图(其中队头指针指向头节点): 不带结点的链式队列如下图: 链队的存储类型可定义为: 三、链队的初始化 初始化时,通过malloc()函数创建一个只包含头结点的空链式队列Q,该头结点中包含队头指针front和队尾指针rear,然后将它们的指针域都指向空(NULL),代码如下: 四、判断链队是否为空队 判断链队是否为空,只需判断即可,代码如下: 由于通过链式存储实现队列,就不会存在

小宇y的博客 1万+

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务 | 【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

君逍遥o 318

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据结构~10.顺序队和链队

数据结构学习~10.顺序队和链队 本文是上一篇文章的后续,详情点击该链接~ 顺序队 循环队列        在顺序队中,通常让队尾指针rear指向刚进队的元素位置,让队首指针front指向刚出队的元素位置。因此,元素进队的时候,rear要向后移动:元素出队的时候,front也要向后移动。这样经过一系列的出队和进队操作以后,两个指针最终会达到数组末端MAXSIZE - 1 处。虽然队中已经没有元素,但仍然无法让元素进队,这就是所谓的 "假溢

qq_41424688的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

链队的基本操作和简单实现

什么时候使用链队? 若用户无法估计所用队列的长度,则宜采用链队列 链式队列的表示(Q.front指向头结点,Q.rear指向尾结点) 链队列的类型定义 #define MAXQSIZE 100 typedef struct Qnode{ int data; struct Qnode *next; }QNode,*QueuePtr; //一个结点变量,一个指针变量,pointer缩写Ptr ...

ker的博客 6678

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构——链队(定义、初始化、判断空队、入队、出队、遍历)

以下是数据结构中关于链队的定义、初始化、判断空队、入队、出队、遍历等基础操作。链队里有两个指针头指针和尾指针。指针的类型是QNode。QNode里有两个属性data和next指针。

qq_51231048的博客 4369

数据结构——顺序队(循环队列,链队)

顺序队 一、循环队列 1.循环队列 在顺序队中,通常让队尾指针rear指向刚进队的元素位置,让队首指针front指向刚出队的元素位置。因此,元素进队的时候,rear 要向后移动;元素出队的时候,front 也要向后移动。这样经过一系列的出队和进队操作以后,两个指针最终会达到数组末端maxSize-1处。虽然队中已经没有元素,但仍然无法让元素进队,这就是所谓的“假溢出”。要解决这个问题,可以把数组弄成一个环,让rear和front沿着环走,这样就永远不会出现两者来到数组尽头无法继续往下走的情况,这样就产生了循

#两个西柚 2625

数据结构之队列(顺序队和链队)(C语言附完整代码)

队列简称队,它是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作。把进行插入的一端称为队尾,把进行删除的一端称为队头或队首。向队列中插入新元素称为进队或入队,从队列中删除元素称为出队或离队。由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表。采用顺序存储结构的队列称为顺序队声明顺序队//存放队中元素 int front , rear;//队首和队尾指针 } SqQueue;采用链式存储结构的队列称为链队。

m0_62795460的博客 9323

链队为什么要有两个结构体和链队的几个基本功能

链队 链队为什么有俩个结构体? 其实链队不是必须有两个结构体的 typedef struct qnode { ElemType data;//存放数据 struct qnode * next;//下一个结点的指针 }DataNode;//链队数据结点的类型 typedef struct { DataNode *Front;//指向队首的结点 DataNode *re...

小叮当的幻想 2602

李春葆 上机实验题3——实验题4:实现链队的各种基本运算的算法

本实验旨在通过编写一个程序实现链队的存储结构和各种基本运算的算法,包括初始化、判断链队是否非空、进队、出队、输出出队序列以及释放链队。通过这个实验,希望学生能够深入理解链队数据结构的原理和实现方式,并且掌握链队中各种基本运算算法的设计和实现技巧。首先需要定义链队的结构体,包括一个头指针front和一个尾指针rear,以及一个用于存储队列元素的链表。编写一个程序,实现链队(假设栈中的元素类型 ElemType为char的各种基本运算,并在此基础上设计一个程序完成以下功能。(3)依次进链队元素a、b、c。

此人很懒 1415

数据结构之链队实现

文章目录数据结构之链队实现代码及思想测试截图 数据结构之链队实现 代码及思想 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; typedef int ElemType; #define Status int #define ERROR 0 #define...

李霁明的博客 406

链队的基本操作

/***链队的基本操作***/ #include<iostream> #include<fstream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef char QElemType; typedef int Status; typedef char SElemType; //- - - - - 队列的链式存储结构- - - - - typedef struct QNo

qq_47142993的博客 1218

数据结构之队的实现

珍惜当下

X_do_myself的博客 2705

数据结构->链队

链队(Linked Queue)是一种基于链表实现的队列数据结构。

菜鸟学习总结 1135
上一篇: 数据结构实验 5 循环队列的实现
下一篇: Java程序从编写到运行
Binkkkk
博客等级 码龄5年 303粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Binkkkk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值