链队列的基本操作(简单易懂,代码可以直接运行)
(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);
}
下面手把手演示一遍手动输入数据
赠人玫瑰,手留余香,👍也是这样嗷