实验6、链队列的基本操作(简单易懂,代码可以直接运行)

链队列的基本操作(简单易懂,代码可以直接运行)
(1)实验目的
通过该实验,使学生理解链队列的构造特点并灵活应用,掌握链队基本操作的编程实现,认识栈是在一端进行插入,在另一端进行删除集中操作的线性结构,掌握队列的“先入先出”操作特点,知道判断队列空和满的条件,进一步熟悉C语言中指针操作。
(2)实验内容
用链式存储结构,实现教材定义的队列的基本操作。
(3)参考界面
在这里插入图片描述
(4)验收/测试用例
通过菜单调用各个操作,测试点:
 没有初始化前进行其他操作,程序是否能控制住;
 初始化一个队列;
 判队列空,屏幕显示队列为空;
 4个数入队, 1、2、3、5;
 栈长度,屏幕输出4;
 取队头元素,再判栈空,然后再判栈长度。让学生知道取队头元素不改变队列中的内容,队头指针不发生改变;
 出队,再判栈长度;
 销毁队,再做其他操作,判断程序是否能控制;
这个实验相对于实验三来说简单很多,总体代码量减少很多,都是数据结构队列的基本操作,代码在三天内完成的,注释超级清晰嗷,如果对你有帮助的话,点个👍吧
写数据结构实验一定要笑着写
在这里插入图片描述
直接上代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;

#define error 0
#define ok 1
#define overflow -2
#define false -1

typedef int QElemType;
typedef int Status;

typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

//初始化一个队列
Status InitQueue(LinkQueue &Q)
{
	Q.front = (QueuePtr)malloc(sizeof(QNode));
	Q.rear = Q.front;
	if(Q.front == 0)
	{
		exit(overflow);
	}
	Q.front->next = NULL;
	return ok;
} 
//销毁队列
Status DestoryQueue(LinkQueue &Q)
{
	if(Q.front == 0)
	{
		return error;
	}
	QueuePtr q;
	while(Q.front != 0)
	{
		q = Q.front->next;
		free(Q.front);
		Q.front = q;
	}
	return ok;
}
//清空队列
Status ClearQueue(LinkQueue &Q)
{
	if(Q.front == 0)
	{
		return error;
	}
	QueuePtr q;
	QueuePtr p;
	p = Q.front->next;
	while(p != 0)
	{
		q = p->next;
		free(p);
		p = q;
	}
	Q.front = 0;
	return ok;
}
//队列判空
Status EmptyQueue(LinkQueue &Q) 
{
	if(Q.front == 0)
	{
		return error;
	}
	if(Q.front == Q.rear)
	{
		return ok;
	}
	else{
		return false;//队列不为空 
	}
}
//求队列长度
Status QueueLength(LinkQueue &Q,int &count)
{
	if(Q.front == 0)
	{
		return error;
	}
	count = 1;
	QueuePtr p;
	p = Q.front->next;//从首元结点开始计数 
	while(p->next != 0)
	{
		p = p->next;
		count++;
	}
	return ok;
}
//获取队头元素
Status GetElem(LinkQueue &Q,int *e)
{
	if(Q.front == 0)
	{
		return error;
	}
	if(Q.front == Q.rear)
	{
		return false;//此时队列为空,无法获取元素 
	}
	*e = Q.front->next->data;//获取队头元素 
	return ok;
}
//插入一个元素
Status InserElem(LinkQueue &Q,int e)
{
	if(Q.front == 0)
	{
		return error;
	}
	QueuePtr p;
	p = (QueuePtr)malloc(sizeof(QNode));
	p->data = e;
	p->next = 0;
	Q.rear->next = p;
	Q.rear = p;
	return ok;
}
//删除一个元素
Status DelElem(LinkQueue &Q)
{
	if(Q.front == 0)
	{
		return error;
	}
	if(Q.front == Q.rear)
	{
		return false;//此时队列为空,无法删除元素 
	}
	QueuePtr p;
	p = Q.front->next;
	Q.front->next = p->next;
	if(p == Q.rear)//防止Q.rear丢失,无法判断队列是否为空 
	{
		Q.rear = Q.front;
	}
	free(p);
	return ok; 
} 
//队列元素输出
Status VisitElem(LinkQueue &Q)
{
	if(Q.front == 0)
	{
		return error;
	}
	if(Q.front == Q.rear)
	{
		return false;//此时队列为空,无法输出元素 
	}
	QueuePtr p;
	p = Q.front->next;//p先指向队头 
	while(p != 0)
	{
		cout<<p->data<<" ";
		p = p->next;
	}
	return ok;
}
//主函数
int main()\

{
	int i,j,m,e,n,count,M;
	LinkQueue Q;
	Q.front = 0;
	cout<<"********************"<<endl;
	cout<<"h e n u _ 于 笨 笨"<<endl;
	cout<<"1.初始化队列"<<endl;
	cout<<"2.销毁队列"<<endl;
	cout<<"3.清空队列"<<endl;
	cout<<"4.队列判空"<<endl;
	cout<<"5.求队列长度"<<endl;
	cout<<"6.获取队头元素"<<endl;
	cout<<"7.插入一个 元素"<<endl;
	cout<<"8.删除一个元素"<<endl;
	cout<<"9.输出所有元素"<<endl;
	cout<<"输入一个负数退出程序!"<<endl;
	cout<<"********************"<<endl;
	do
	{
		cout<<"请输入你的选择:"<<endl;
		cin>>n;
		switch(n)
		{
			case 1:
				m = InitQueue(Q); 
				if(m == overflow)
				{
					cout<<"队列初始化失败!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列初始化成功!!"<<endl;
				}
				break;
			case 2:
			    m = DestoryQueue(Q);
			    if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列销毁成功!!"<<endl;
				}
				break;
			case 3:
			    m = ClearQueue(Q);
			    if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列清空成功!!"<<endl;
				}
				break;
			case 4:
				m = EmptyQueue(Q);
				if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列为空!!"<<endl;
				}
				else if(m == false)
				{
					cout<<"队列不为空!!"<<endl;
				 } 
				break;
			case 5:
				m = QueueLength(Q,count);
				if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列长度为:"<<count<<endl;
				}
				break;
			case 6:
				m = GetElem(Q,&e);
				if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == false)
				{
					cout<<"队列为空!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队头元素为:"<<e<<endl;
				}
				break;
			case 7:
				cout<<"请输入你要插入的元素:"<<endl;
				cin>>e;				
				m = InserElem(Q,e);
				if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"元素插入成功!!"<<endl;
				}
				break;
			case 8:
			    m = DelElem(Q);
			    M = EmptyQueue(Q);
			    if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"元素删除成功!!"<<endl;
				}
				if(M == ok)
				{
					cout<<"队列已经为空!!"<<endl;
				}
				break;
			case 9:
				m = VisitElem(Q);
				if(m == error)
			    {
			    	cout<<"请先初始化队列!!"<<endl;
				}
				else if(m == ok)
				{
					cout<<"队列元素输出:"<<endl;
					VisitElem(Q);
					cout<<endl;
				}
				break;
			default :
				cout<<"请输入1~9内的数字!!"<<endl;
				break; 
		}
	}while(n > 0);
	
} 

下面手把手演示一遍手动输入数据
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
赠人玫瑰,手留余香,👍也是这样嗷
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

henu-于笨笨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值