




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
队列实验报告小组成员:xxxxxxxx日期:xxxxxxxx1、 需求分析(xxx)1. 链队列1) 在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。最后销毁队列,释放空间。2) 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3) 程序执行的命令包括:欢迎来到链队列1输出队列长度2元素入队3元素出队4销毁队列5清空队列6对头元素7退出链队列4) 测试数据入队 1 2 3 4 5分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。2. 顺序队列1) 在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2) 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括:欢迎来到顺序队列1入队2出队3判断是否为空4取得头结点5输出显示6退出顺序队列4)测试数据入队 1 2 3 4 5分别执行“元素入队”“元素出队”等操作。3循环队列1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2) 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括:欢迎来到循环队列1入队2出队3判断是否为空4取得头结点5输出显示6退出顺序队列4)测试数据入队 1 2 3 4 5分别执行“元素入队”“元素出队”等操作。2 概要设计(xxxx) 为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下:ADT Queue 数据对象:D= ai|aiElemSet, i=1,2,3.,n, n=0 数据关系: R= |ai-1,aiD,i=2,.,n 基本操作: InitQueue (&Q) 操作结果:构造一个空队列。 DestroyQueue (&Q) 初始条件:队列Q已存在。 操作结果:队列Q已被销毁。 ClearQueue(&Q) 初始条件:队列Q已存在。 操作结果:将Q清为空队列。 QueueEmpty(Q) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回TRUE,否则FALSE。 QueueLength(Q) 初始条件:队列Q已存在。 操作结果:返回Q元素的个数,即队列的长度。 GetHead(Q,&e) 初始条件:Q为非空队列。 操作结果:用e返回Q的队头元素。 EnQueue (&Q,e) 初始条件:队列Q已存在。 操作结果:插入e返回Q的新的队尾元素。DeQueue (&Q,&e) 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。 ADT Queue2.单链队列typedef struct QNode QElemType; struct QNode *next;/指针域QNode,*QueuePtr;Typedef structQueuePtr front;QueuePtr rear;LinkQueue;Status InitQueue (LinkQueue&Q) /构造一个空队列。 Status DestroyQueue (LinkQueue&Q) /销毁队列Q,Q不存在。 Status ClearQueue(LinkQueue&Q) /将Q清为空队列。 Status QueueEmpty(LinkQueueQ) /若Q为空队列,则返回TRUE,否则FALSE。 int QueueLength(LinkQueueQ) /返回Q元素的个数,即队列的长度。 Status GetHead(LinkQueueQ,QElemType&e) /若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。 Status EnQueue (LinkQueue&Q,QElemType e)/插入e返回Q的新的队尾元素。Status DeQueue (LinkQueue&Q,QElemType&e) /若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;否则返回ERROR。 三详细设计(xxx)1. 顺序队列的实现和运算1)元素的类型typedef struct Datatype dataMAXSIZE; int front,rear; Squeue;2)空的队列的构造void InitSqueue(Squeue *p) /*初始化队列*/ p-front=0; p-rear=0; 3)元素的入队int Ensqueue1(Squeue1 *q, Datatype e) /*入队*/ if(q-rear+1)% MAXSIZE = q-front) printf(n队列已满n); return 0; 4)元素的出队int DeSqueue1(Squeue1 *q,Datatype *e) /*出队*/ if (q-front=q-rear) printf(队列已空,无法出队!); return 0; *e=q-dataq-front; q-front=(q-front+1)%MAXSIZE; return 1; 5)判断队列是否为空int QueueEmpty1(Squeue1 q) / 判断是否为空 if (q.front=q.rear) return 1; else return 0; 6)队头元素的取值的算法int Gethead1(Squeue1 *q,Datatype *e) / 取对头元素 if (q-front=q-rear) printf(队列已空,无法出队!); return 0; else *e=q-dataq-front; return 1; 7)遍历顺序队列的算法void display1(Squeue1 q) /遍历顺序对列 printf(此队列数据为:n); if (q.front=q.rear) printf(此队列为空!); else while(q.front front=q-rear=malloc(sizeof(QNode); if(!q-front) exit(1); q-front-next=NULL;2)元素的入队算法void EnQueue2(LinkQueue *q, QElemType e)/将元素e进队 QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode);/创建新节点if(!p)/如果内存分配成功exit(1);p-data=e;/初始化新节点数据为e p-next=NULL;q-rear-next=p;q-rear=p;3)元素的出队的算法int DeQueue2(LinkQueue *q,QElemType e)/队头结点出队,将出队的元素存入eQueuePtr p;if(q-front=q-rear)/队列为空return 0;p=q-front-next;/初始化temp为要出队的结点指针if(q-front-next=q-rear)/要出队的结点为最后一个结点q-rear=q-front;e=p-data;/要出队的数据元素为eq-front-next=p-next;/使下一个结点变为对头free(p);/删除要出队的结点return e;4)队列的长度算法void QueueLength2(LinkQueue *q)/返回队列长度QueuePtr p;int i=0; p=q-front-next;while(p)+i;p=p-next;printf(链队列长度为:%dn,i);5)队列的销毁void DestroyQueue2(LinkQueue *q)while(q-front)q-rear=q-front-next;free(q-front);q-front=q-rear;if(!q-rear)free(q-rear);free(q-front);6)队列的输出算法void output2(LinkQueue *q)/输出队列QueuePtr p;p=q-front-next;printf(链队列元素依次为:);while(p)printf(%d-,p-data);p=p-next;printf(n);7)队列的清空的算法void Clear2(LinkQueue *q)/清空队列QueuePtr temp=q-front-next;while(temp)QueuePtr tp=temp;temp=temp-next;free(tp);temp=q-front;q-front=q-rear=NULL;free(temp);8)返回对头元素的算法int GetHead2(LinkQueue *q, int *e)/返回对头结点元素,存入eif(q-front=q-rear)return 0;*e=q-front-next-data;return 1;3. 循环队列的实现和运算1)队列的初始化算法void InitSqueue3(Squeue3 *p) /*初始化队列*/ p-base=(Datatype *)malloc(sizeof(Datatype)* MAXSIZE); p-front=0; p-rear=0; 2)入队的算法int Ensqueue3(Squeue3 *q, Datatype e) /*入队*/ if(q-rear+1)% MAXSIZE = q-front) printf(n队列已满n); return 0; else q-baseq-rear=e;/*将接收到得值付给队尾所指的节点*/ q-rear=(q-rear+1) % MAXSIZE;/*队尾向后移一位完成入队*/ return 1; 3)出队的算法int DeSqueue3(Squeue3 *q,Datatype *e) /*出队*/ if (q-front=q-rear) printf(队列已空,无法出队!); return 0; *e=q-baseq-front; q-front=(q-front+1)%MAXSIZE; return 1; 4判断队列是否为空的算法int QueueEmpty3(Squeue3 q) / 判断是否为空 if (q.front=q.rear) return 1; else return 0; 5)对头元素的返还的算法int Gethead3(Squeue3 *q,Datatype *e) / 取对头元素 if (q-front=q-rear) printf(队列已空,无法出队!); return 0; else *e=q-baseq-front; return 1; 6)遍历循环队列的算法void display3(Squeue3 *q) /遍历循环对列 int tail; tail=q-front; printf(此队列数据为:n); if (q-front=q-rear) printf(此队列为空!); else while(tail!=q-rear) printf(%dt, q-basetail); tail=(tail+1)%MAXSIZE; printf(n); 4.主函数的算法void main() int choice;Datatype e1;int i1,a1,x1,s1,j1; /顺序队列定义的量 int e2,i2,n2,s2,a2; /链队列定义的量int i3,a3,x3,s3,j3; /循环队列定义的量Datatype e3;Squeue1 Q1; /* LinkQueue q;/*Squeue3 Q;/* choice=-1; Begin(); while(choice!=0) scanf(%d,&choice); switch(choice) case 1:/顺序队列 system(cls); InitSqueue1(&Q1); printf(创建队列完成!n); printf(请输入数据个数j1=); scanf(%d,&j1); for(i1=1; i1=j1;i1+) /输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 printf(请输入第%d个数据:,i1); scanf(%d,&a1); Ensqueue1(&Q1,a1); printf(对头为:%dn,Q1.dataQ1.front); printf(队尾为:%dn,Q1.dataQ1.front+j1-1); display1(Q1); s1=-1; start1(); while(s1!=0) scanf(%d,&s1); switch(s1) case 0: system(cls); choice=-1; Begin();break; case 1: system(cls); printf(请输入入队元素:n ); scanf(%d,&x1); Ensqueue1(&Q1,x1); display1(Q1); s1=-1; start1(); break; case 2: system(cls); DeSqueue1(&Q1,&e1); display1(Q1); s1=-1; start1(); break; case 3: system(cls); if(QueueEmpty1(Q1) printf(此队列为空!n); else printf(此队列不为空!n); s1=-1; start1(); break; case 4: system(cls); Gethead1(&Q1,&e1); printf(对头元素为:%dn,e1); s1=-1; start1(); break; case 5: system(cls); display1(Q1); s1=-1; start1(); break; /switch/while /case1 break;/* case 2: system(cls); InitQueue2(&q); printf(创建队列完成!n); printf(输入将建立链队列元素的个数:n2=); scanf(%d,&n2); printf(请输入队列的元素:n); for(i2=1;i2=n2;i2+) printf(请输入第%d个元素:,i2); scanf(%d,&e2); EnQueue2(&q,e2); a2=-1; start2(); while(a2!=0) scanf(%d,&a2); switch(a2) case 1:system(cls); QueueLength2(&q); a2=-1; start2(); break;case 2:system(cls);printf(请输入入队元素:);scanf(%d,&e2); EnQueue2(&q,e2);output2(&q); a2=-1; start2(); break;case 3: system(cls); e2=DeQueue2(&q,e2);output2(&q);printf(出队元素为:%dn,e2); a2=-1; start2();break;case 4:DestroyQueue2(&q); printf(队列已销毁!n);a2=0; system(cls); choice=-1; Begin();break;case 5:Clear2(&q); printf(队列已清空n);a2=0; system(cls); choice=-1; Begin();break;case 6:system(cls); GetHead2(&q,&e2); printf(队头元素为:%dn,e2); s2=-1; start2(); break;case 0: system(cls); choice=-1; Begin();break;/switch/while /case2 break;/* case 3: system(cls); InitSqueue3(&Q); printf(创建队列完成!n); printf(请输入数据个数j3=); scanf(%d,&j3); for(i3=1; i3=j3;i3+) /输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 printf(请输入第%d个数据:,i3); scanf(%d,&a3); Ensqueue3(&Q,a3); printf(对头为:%dn,Q.baseQ.front); printf(队尾为:%dn,Q.baseQ.front+j3-1); display3(&Q); s3=-1; start3(); while(s3!=0) scanf(%d,&s3); switch(s3) case 0: system(cls); choice=-1; Begin(); break; case 1: system(cls); printf(请输入入队元素:n ); scanf(%d,&x3); Ensqueue3(&Q,x3); display3(&Q); s3=-1; start3(); break; case 2: system(cls); DeSqueue3(&Q,&e3); display3(&Q); s3=-1; start3(); break; case 3: system(cls); if(QueueEmpty3(Q) printf(此队列为空!n); else printf(此队列不为空!n); s3=-1; start3(); break; case 4: system(cls); Gethead3(&Q,&e3); printf(对头元素为:%dn,e3); s3=-1; start3(); break; case 5: system(cls); display3(&Q); s3=-1; start3(); break; /switch /while /case 3 break; case 0: printf( 谢谢使用!n); break;/*/switch/while /main4 调试分析(xxx)顺序队列1. 编译并调试,运行程序。2. 设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.判断队列是否为空。队列是否为空的标志就是队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等。4.队列满时候不能入队列,否则会出现溢出现象。即先要判断队列是否已经已满,因为队尾指针的最大值是MAXQSIZE,所以通过检查队尾指针rear是否等于MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。5.在元素出队操作,先通过队头指针和队尾指针是否相等判断队列是否已空,空时不能操作,这是要注意的。 6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。7.本程序存在较多不足,如有问题,参考用户手册。8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。链队列1.编译并调试,运行程序。2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.要注意设定一个在链队列添加一个头结点并令指针指向头结点。同时,删除不可以在最后面进行删除,但是插入可以最后一个进行插入,这点需要注意4.需要分别指向队头和队尾的指针。5.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。6.本程序存在较多不足,如有问题,参考用户手册。7.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。循环队列1.编译并调试,运行程序。2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.为了避免顺序队列造成的“假溢出”现象,我们通常采用顺序循环队列实现队列的顺序存储。4.队头指针和对尾指针与队列元素之间关系和顺序队列一样,不变。5.先判断队列是否为空。就是看队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等,空时不能操作,这是要注意的。6.在将元素插入到队列之前首先要判断队列是否已经已满,根据顺序循环队列队满条件front=(rear+1)%MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。7.本程序存在较多不足,如有问题,参考用户手册。8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。五、 用户手册(xx)1.链队列(1) 本程序的运行环境为DOS操作系统,执行文件名为:j.exe.(2) 进入演示程序后即显示文本方式的用户界面,输入元素1,2,3,4,5创建队列。 (3) 根据提示,选择操作2执行元素入队操作。回车, 输入入队元素0,回车,将0插入到队列中。 (4)选择操作3执行元素出队操作,回车,队首元素1出队。 (5)选择操作1执行输出队列长度操作,回车, 输出队列长度为5. (6)选择操作5执行清空队列操作,回车,清空。 (7) 选择操作6执行输出队头元素操作,回车,输出元素2。 2. 顺序队列(1)创建队列,输入数据 1,2,3,4,5. (2) 选择操作1,执行入队操作.输入入队元素0(3)选择操作2,执行出队操作。队首元素1出队.(4)选择操作3,判断对是否为空(5) 选择操作4,输出对头元素2.(6) 选择操作5,显示队列元素 3、循环队列(1)创建队列,输入数据 1,2,3,4,5. (2)选择操作1,执行入队操作.输入入队元素0(3)选择操作2,执行出队操作。队首元素1出队.(3) 选择操作3,判断对是否为空(5) 选择操作4,输出对头元素2.(6) 选择操作5,显示队列元素为,2,3,4,5,0六测试结果(xxx)1. 顺序队列的实现和运算1)输入1即可进行进入到顺序队列2)顺序队列的建立,输入元素的个数为5,输入的数据分别为1 ,2 , 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童特殊教育学校入托协议(全方位责任界定)
- 教育机构教师劳动合同签订与教学质量承诺书
- 旅游景区租赁合同附加旅游服务及设施维护协议
- 离婚协议书示范文本及财产分配、债务承担
- 住宅小区物业服务附加租赁合同规范文本
- 知识产权授权许可及市场推广合同范本
- 油气输送管道空场地租赁及管道维护合同
- 离婚协议起草及财产分割服务合同
- 煤炭储备基地场地租赁及仓储管理服务合同
- 大数据应用企业股权转让与数据资源共享合同
- (一检)泉州市2026届高三高中毕业班质量监测(一)数学试卷(含标准答案)
- 2025年福建省榕圣建设发展有限公司项目招聘12人笔试参考题库附带答案详解
- 矿山设备检修安全培训课件
- 2025-2030数据安全合规审计服务市场爆发及等保测评机构并购价值评估
- 2025年中国华电集团招聘面试题解析及备考建议手册
- 2025年机器人面试题及答案解析
- 高三第一次月考总结主题班会课件
- 智慧农业信息化解决方案
- 二十四山开门放水作灶真诀
- 生物基础电子教案分享
- 小学六年级体育教案(全册48课时)
评论
0/150
提交评论