首页 链队列存储表示及基本操作的实现

链队列存储表示及基本操作的实现

举报
开通vip

链队列存储表示及基本操作的实现石家庄经济学院 实 验 报 告 学 院: 数理学院 专 业: 数学与应用数学 班 级: 一班 学 号: XXXXXXXX 姓 名: XXXX 信息工程学院计算机实验中心制 实验题目:链队列存储表示及基本操作的实现 实验室: 260 设备编号: 402 完成日期: 2011/05/13 一、实验目的 1.掌握队列的思想及其存储实现。 2.掌握...

链队列存储表示及基本操作的实现
石家庄经济学院 实 验 报 告 学 院: 数理学院 专 业: 数学与应用数学 班 级: 一班 学 号: XXXXXXXX 姓 名: XXXX 信息工程学院计算机实验中心制 实验题目:链队列存储 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示及基本操作的实现 实验室: 260 设备编号: 402 完成日期: 2011/05/13 一、实验目的 1.掌握队列的思想及其存储实现。 2.掌握队列的常见算法的程序实现。 二、实验内容 1.建立一个链式空队列,并能够完成出队、入队及求队长等基本操作。。 三、实验的内容及完成情况 1. 需求分析 (1)链队列的抽象数据类型ADT的描述及实现。 本实验实现使用Visual c++6.0实现线性表顺序存储结构的表示及操作。具体实现要求: (2)完成链式队列的表示和实现。 (3)实现链式队列的建立和初始化。 (4)实现链式队列的入队、出队、求队长等操作。 2.概要设计 抽象数据类型队列的定义: ADT Queue{ 数据对象:D={ai |ai∈ ElemSet,i=1,2,……,n,n≥0} 数据关系:R1={|ai-1,ai∈ D,i=2,……,n} 约定其中a1端为队列头,an端为队列尾。 基本操作: InitQueue(&Q)    操作结果:构造一个空队列Q。 EnQueue(&Q,e)    初始条件:队列Q已存在。    操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q,&e)    初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。 Queuelength(&Q)    初始条件:队列Q已存在。    操作结果:返回Q的元素个数,即队列长度。 DestroyQueue(LinkQueue &Q) //销毁队列Q,队列Q不再存在 } ADT Queue; 3.详细设计 (1)抽象数据类型队列的表示和实现 //链式队列结构类型 typedef struct QNode { Qelemtype data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; //构造一个空队列 status InitQueue(LinkQueue &Q) {//构造一个空的队列Q Q.front=Q.rear=(QueuePtr)malloc(100*sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.rear->next=NULL; return OK; } //插入队尾元素 status EnQueue(LinkQueue &Q,Qelemtype e) {//插入元素e为Q的新的队尾元素 p=(QueuePtr)malloc(100*sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } //删除队头元素 status DeQueue(LinkQueue &Q,Qelemtype &e) {//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK; //否则返回ERROR; if(Q.rear==Q.front) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return OK; } //求队列长度 void Queuelength(LinkQueue &Q) { n=0; p=Q.front->next; while(p!=NULL) { n++; p=p->next; } printf("链队列长度为:%d\n",n); } //销毁队列 status DestroyQueue(LinkQueue &Q) {//销毁队列 while(Q.front) { Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } printf("队列已销毁!\n"); return OK; } (2)主函数的伪码算法 void main()//主函数 { int a; printf("》》》》》》》》>>数据结构实验二<<《《《《《《《《\n"); printf("**********链队列存储表示及基本操作的实现*********\n"); do { menu(); printf("请按提示输入指令:"); scanf("%d",&a); switch(a) {//调用各函数 case 1:{ input(); output(Q); }break; case 2: Queuelength(Q);break; case 3:{ printf("请输入入队元素:"); scanf("%d",&e); if(EnQueue(Q,e)==1) output(Q); }break; case 4:if(DeQueue(Q,e)==1) { output(Q); printf("出队元素为:%d\n",e); } else printf("队列为空~无法执行删除操作~\n"); break; case 5: DestroyQueue(Q);break; case 0: printf("谢谢您的使用,再见 (*^__^*)!\n"); return; default : printf("输入有误,请重新输入 (*^__^*)\n"); } }while(a!=0); } 4. 调试分析 (1) 调试过程中出现的问题 经过上次试验的练习,这次调试过程没有出现变量定义问题等的小错误;主要是逻辑错误,可以通过组建和编译,但是运行的时候达不到要求。通过简单的修改就可以啦! (2) 经验和体会 1. 多思考、多尝试才能更好的完成程序的编写。 2. 算法是程序编写的灵魂,透彻的了解算法有助于编写程序。 3. 编写程序时细心才能少出错! (3) 算法的时空分析和改进 入队操作:T(n)=O(1); 出队操作:T(n)=O(1); 求队列长度:T(n)=O(n); 销毁队列:T(n)=O(n); 5.用户使用说明 打开可执行程序,即Visual C++6.0环境下,,参照用户选择界面提示即可使用本程序 6.测试结果 演示操作如下:运行程序 输入指令:1 创建队列并初始化 初始化完毕,输入指令:3 入队操作 入队操作完毕,输入指令:4 出队操作 出队操作完毕,输入指令:2 输出队列长 操作完毕,输入指令:5 销毁队列 演示完毕,输入指令:0 退出系统 7.附录 源程序清单: #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Qelemtype; typedef int status; typedef struct QNode { Qelemtype data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; int e,i,n; QueuePtr p; LinkQueue Q; status InitQueue(LinkQueue &Q) {//构造一个空的队列Q Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; } status EnQueue(LinkQueue &Q,Qelemtype e) {//插入元素e为Q的新的队尾元素 p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } status DeQueue(LinkQueue &Q,Qelemtype &e) {//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK; //否则返回ERROR; if(Q.rear==Q.front) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return OK; } status Queuelength(LinkQueue &Q) { if(Q.rear==Q.front) return ERROR; n=0; p=Q.front->next; while(p!=NULL) { n++; p=p->next; } printf("链队列长度为:%d\n",n); return OK; } status DestroyQueue(LinkQueue &Q) {//销毁队列 while(Q.front) { Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } printf("队列已销毁!\n"); return OK; } void input() { if(InitQueue(Q)!=1) printf("分配空间失败!"); printf("输入将建立链队列元素的个数:n= "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("链队列第%d个元素的值为:",i); scanf("%d",&e); EnQueue(Q,e); } } void output(LinkQueue &Q) { p=Q.front->next; printf("链队列元素依次为:"); while(p!=NULL) { printf("%d-->",p->data); p=p->next; } printf("\n"); } void menu() {//菜单函数 printf("==================================================\n"); printf(" ★1建立队列并初始化 \n"); printf(" ★2输出队列长度 \n"); printf(" ★3元素入队 \n"); printf(" ★4元素出队 \n"); printf(" ★5销毁队列 \n"); printf(" ★0退出系统 \n"); printf("==================================================\n"); }//menu void main()//主函数 { int a; printf("》》》》》》》》>>数据结构实验二<<《《《《《《《《\n"); printf("**********链队列存储表示及基本操作的实现*********\n"); do { menu(); printf("请按提示输入指令:"); scanf("%d",&a); switch(a) {//调用各函数 case 1:{ input(); output(Q); }break; case 2: Queuelength(Q);break; case 3:{ printf("请输入入队元素:"); scanf("%d",&e); if(EnQueue(Q,e)==1) output(Q); }break; case 4:if(DeQueue(Q,e)==1) { output(Q); printf("出队元素为:%d\n",e); } else printf("队列为空~无法执行删除操作~\n"); break; case 5: DestroyQueue(Q);break; case 0: printf("谢谢您的使用,再见 (*^__^*)!\n"); return; default : printf("输入有误,请重新输入 (*^__^*)\n"); } }while(a!=0); } 四、实验总结 1.掌握了队列的思想及其存储实现。 2.掌握了队列的常见算法的程序实现,如建队、入队、出队、求队长、销毁队列等。 3.熟练了C程序的编写和链表指针的使用。 五、成绩
本文档为【链队列存储表示及基本操作的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_729292
暂无简介~
格式:doc
大小:231KB
软件:Word
页数:10
分类:理学
上传时间:2011-11-07
浏览量:28