实验4队列子系统.docx
《实验4队列子系统.docx》由会员分享,可在线阅读,更多相关《实验4队列子系统.docx(10页珍藏版)》请在冰豆网上搜索。
实验4队列子系统
验证性实验4:
队列子系统
班级:
H1001学号:
09姓名:
陆俊实验日期:
2011.10.19、10.26
1.实验目的
(1)掌握队列的特点及其描述方法。
(2)用链式结构实现一个队列。
(3)掌握队列的各种基本操作。
(4)掌握队列的简单应用程序。
2.实验内容
(1)设计一个字符型的链队列。
(2)编写队列的进队、出队、读队头元素、显示队列中全部元素程序。
(3)设计一个输入限制性的双队列,要求:
输入只能在一端进行,而输出可以选择从队头输出或队尾输出,全部选择完毕后能显示所选择的输出结果。
设计一个选择式菜单,以菜单方式选择队列的各种基本操作。
菜单形式如下:
队列子系统
***************************************************
*1------------进队*
*2------------出队*
*3------------读队头元素*
*4------------显示*
*5------------双队列*
*0------------退出*
***************************************************
请选择菜单号(0--5):
3.实验程序
#include
typedefstructqueuenode
{
intdata;
structqueuenode*next;
}QueueNode;
typedefstruct
{
QueueNode*front,*rear;
}LinkQueue;
voidInQueue(LinkQueue*q)
{
intx;
QueueNode*p=newQueueNode;
printf("\n\t\t请输入一个整数:
");
scanf("%d",&x);
getchar();
p->data=x;
p->next=NULL;
if(q->front==NULL)
q->front=p;
else
q->rear->next=p;
q->rear=p;
if(p)
printf("\n\t\t%d进队成功!
",x);
}
intOutQueue(LinkQueue*q,int*v)
{
QueueNode*p;
if(q->front==NULL)
return0;
else
{
p=q->front;
*v=p->data;
q->front=p->next;
if(q->front==NULL)
q->rear=NULL;
deletep;
return1;
}
}
voidShowQueue(LinkQueue*q)
{
QueueNode*p=q->front;
if(p==NULL)
printf("\n\t\t队列为空!
\n");
else
{
printf("\n\t\t队列中的元素为:
");
while(p!
=NULL)
{
printf("%6d",p->data);
p=p->next;
}
printf("\n");
}
}
voidReadFront(LinkQueue*q)
{
if(q==NULL||q->front==NULL)
printf("\n\t\t队列为空!
没有对顶元素!
\n");
else
printf("\n\t\t队首元素是:
%4d\n",q->front->data);
}
#defineQUEUEMAX20
intqueue[QUEUEMAX];
intfront=-1;
intrear=-1;
voidInQueue(intval)
{
rear=(rear++)%QUEUEMAX;
if(front==rear)
printf("\n\t\t队列已满!
");
else
queue[rear]=val;
}
intOutQueue_rear()
{
intt;
if(front==rear)
return-1;
t=queue[rear--];
if(rear<0&&front!
=-1)
rear=QUEUEMAX-1;
returnt;
}
intOutQueue_front()
{
intt;
if(front==rear)
return-1;
else
t=queue[++front];
if(front==QUEUEMAX)
front=0;
returnt;
}
intDQ()
{
intchoice;
intout[5];
intin[5]={5,4,3,2,1};
intt,pos=0,i;
for(i=0;i<5;i++)
InQueue(in[i]);
printf("\n\t\t初始数据顺序是:
");
for(i=0;i<5;i++)
printf("[%d]",in[i]);
printf("\n\t\t1------从头出队2------从尾出队\n\n");
while(front!
=rear)
{
printf("\t\t请输入选择(1或2):
");
scanf("%d",&choice);
switch(choice)
{
case1:
t=OutQueue_front();
out[pos++]=t;
break;
case2:
t=OutQueue_rear();
out[pos++]=t;
break;
}
}
printf("\n\t\t数据输出的顺序是:
");
for(i=0;i<5;i++)
printf("[%d]",out[i]);
printf("\n");
getchar();
returnchoice;
}
voidmain()
{
LinkQueue*q=newLinkQueue;
intval,i=1;
charw,choice;
q->front=q->rear=NULL;
while(i)
{
printf("\n");
printf("\n\t\t队列子系统");
printf("\n\t\t***************************************************");
printf("\n\t\t*1------------进队*");
printf("\n\t\t*2------------出队*");
printf("\n\t\t*3------------读队头元素*");
printf("\n\t\t*4------------显示*");
printf("\n\t\t*5------------双队列*");
printf("\n\t\t*0------------退出*");
printf("\n\t\t***************************************************");
printf("\n\t\t请选择菜单号(0--5):
");
scanf("%c",&choice);
getchar();
switch(choice)
{
case'1':
InQueue(q);break;
case'2':
if(OutQueue(q,&val)==0)
printf("\n\t\t队列为空!
\n");
else
printf("\n\t\t出队元素为:
%d",val);
break;
case'3':
ReadFront(q);
break;
case'4':
ShowQueue(q);
break;
case'5':
DQ();
break;
case'0':
i=0;
break;
default:
;
}
if(choice=='1'||choice=='2'||choice=='3'||choice=='4'||choice=='5')
{
printf("\n\n\t\t按【Enter】键继续,按任意键返回主菜单,\n");
w=getchar();
if(w!
='\xA')
i=0;
}
}
}
4.程序运行
5.实验小结
这次的实验花了90分钟(两节课)的时间把程序代码打完运行了一遍,从完成时间上来说,要比上次实验的又快了点。
这次的程序代码在第一次运行时提示出现了很多错误,然后我就一个个地都纠正了几次。
除了提示只有一个错误的那个错误外,其他都是我漏打某些语句的单词造成的error,主要还是有点粗心啊!
最后一个错误是DQ双列表上漏了加一个返回值,加上去就行了,而书上没有加。
可能是新版的书有很多错误的原因吧,没注意就按着书上的代码打了下来,结果有了些错误。