数据结构实验队列附程序.docx
《数据结构实验队列附程序.docx》由会员分享,可在线阅读,更多相关《数据结构实验队列附程序.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构实验队列附程序.docx](https://file1.bdocx.com/fileroot1/2023-4/19/498a531f-5de7-4476-99ca-f0c7a8840779/498a531f-5de7-4476-99ca-f0c7a88407791.gif)
数据结构实验队列附程序
实验三队列
一、实验目的
1.了解队列的特性。
2.掌握队列的顺序表示和实现。
3.掌握队列的链式表示和实现。
二、实验内容
实验3.3队列的顺序表示和实现
编写一个程序实现顺序队列的各种基本运算(采用循环队列),并在此基础上设计一个主程序,完成如下功能:
(1)初始化队列。
(2)建立顺序队列。
(3)入队。
(4)出队。
(5)判断队列是否为空。
(6)取队头元素。
(7)遍历队列。
实验3.4队列的链式表示和实现
编写一个程序实现链队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化并建立链队列。
(2)入链队列。
(3)出链队列。
(4)遍历链队列。
#include
#include
#defineMAXQSIZE100
typedefstruct
{
int*base;
intfront;
intrear;
}SqQueue;
intInitQueue(SqQueue&Q)
{
Q.base=(int*)malloc(MAXQSIZE*sizeof(int));
if(!
Q.base)exit(0);
Q.front=Q.rear=0;
return0;
}//初始化顺序队列
intQueueLength(SqQueueQ)
{
inti;
i=(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
printf("队列长度%5d\n",i);
if(i)printf("队列非空");
else
printf("队列为空");
return0;
}//判断队列是否为空
intEnQueue(SqQueue&Q,inte)
{
if((Q.rear+1)%MAXQSIZE==Q.front)return0;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return0;
}//将元素e入队
intDeQueue(SqQueue&Q,inte)
{
if(Q.front==Q.rear)return0;
e=Q.base[Q.front];
printf("%5d\n",e);
Q.front=(Q.front+1)%MAXQSIZE;
return0;
}//删除元素e并返回其值
intGetHead(SqQueue&Q,inte)
{
if(!
(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE)return0;
e=Q.base[Q.front];
printf("返回队头元素%5d\n",e);
return0;
}//返回队头元素e
voidPrintQueue(SqQueue&Q)
{
intk;
printf("顺序队列中的元素:
\n");
for(k=Q.front;k!
=Q.rear;k++)
printf("%5d",Q.base[k]);
printf("\n");
}//遍历顺序队列
voidmain()
{
inte,i,n;
SqQueueQ;
InitQueue(Q);
printf("1—元素入队;2—元素出队;3—返回队头元素;4—队列空否0—结束运行\n");
printf("\n");printf("\n");printf("\n");
printf("\n");printf("\n");
printf("选择:
");
scanf("%d",&n);
printf("\n");printf("\n");
while(n!
=0)
{
switch(n)
{
case1:
printf("入队元素:
");scanf("%d",&e);EnQueue(Q,e);PrintQueue(Q);printf("\n");printf("\n");break;
case2:
printf("出队元素:
");DeQueue(Q,e);PrintQueue(Q);printf("\n");printf("\n");break;
case3:
GetHead(Q,e);printf("\n");printf("\n");break;
case4:
QueueLength(Q);printf("\n");printf("\n");break;
}
printf("选择:
");
scanf("%d",&n);
printf("\n");printf("\n");
}
printf("结束运行。
再见!
\n");
}
链式队列
#include
#include
typedefstructQNode
{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
intInitQueue(LinkQueue&Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)exit(0);
Q.front->next=NULL;
return0;
}//初始化链式队列
intEnQueue(LinkQueue&Q,inte)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit(0);
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return0;
}//在队尾插入元素e
intDeQueue(LinkQueue&Q,inte)
{
QueuePtrp;
if(Q.front==Q.rear)return0;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return0;
}//删除队头元素e
intPrintQueue(LinkQueue&Q)
{
QueuePtrp;
printf("链式队列中的元素");
if(Q.front->next!
=NULL)
{
p=Q.front->next;
if(Q.front->next!
=NULL)
do
{
printf("%5d",p->data);
p=p->next;
}while(p!
=NULL);
}
else
printf("队列为空\n");
printf("\n");
return0;
}//遍历链式队列
voidmain()
{
LinkQueueQ;
inte,m;
printf("\n");printf("\n");printf("\n");printf("\n");
printf("1——插入元素;2——删除元素;0——结束运行\n");
printf("\n");printf("\n");printf("\n");
InitQueue(Q);
printf("\n");printf("\n");
printf("选择:
");
scanf("%d",&m);
printf("\n");printf("\n");
while(m!
=0)
{
switch(m)
{
case1:
printf("插入元素:
");scanf("%d",&e);EnQueue(Q,e);PrintQueue(Q);printf("\n");printf("\n");break;
case2:
DeQueue(Q,e);PrintQueue(Q);printf("\n");printf("\n");break;
}
printf("选择:
");
scanf("%d",&m);
printf("\n");printf("\n");
}
printf("结束运行。
再见!
\n");
}