




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计实验报告 题 目 双向链表 学 院 专 业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 编写日期 2010-7-16 目录1. 问题分析.31.1基本要求.31.2分析过程.32. 数据结构描述.33. 算法设计.43.1算法1:双向链表的建立.43.2算法2:双向链表的查找43.3算法3:双向链表的插入.53.4算法4:双向链表的删除.54. 程序清单65. 程序运行结果106. 总结11l 1.问题分析1.1【基本要求】:建立双向链表,并进行插入,查找,删除等操作。1.2【分析过程】:先通过创建函数建立双向链表,由文本文件提供数据。可以调用查找函数,查找与e值相同的结点是否存在;也可以通过插入函数,在第i个结点前插入值为e的结点,并且调节指针的变化;也可以调用删除函数,删除第i个结点,调节好指针,最后通过保存函数保留数据到文本文件中。l 2.数据结构描述#include#includeusing namespace std;typedef struct dulnode int data; struct dulnode *prior; struct dulnode *next; dulnode,*dulinklist;l 3.算法设计3.1算法1:创建双向链表status create_dul(dulinklist &l) /*利用尾插法建立头带头结点的双向链表 */ l=(dulinklist)malloc(sizeof(dulnode); /* 生成头结点 */ l-prior=null; l-next=null; /* 头结点的指针域初始值为空 */ l-data=-1; q=l; /* 尾指针初始指向头结点 */ file* fp; /* 定义文件指针的形式 */ if(fp=fopen(f:test1.txt,r+)=null) /* 打开文本文件 */ printf(cannot open file!n); exit(0); int n; fscanf(fp,%d,&n); for(i=0;idata); /* 在文件读取结点的数据 */ p-next=null; /* 新结点指针域为空 */ p-prior=q; q-next=p; /* 尾结点指针域指向新结点 */ q=p; /* q指针后移,始终指向尾指针 */ fclose(fp); /* 关闭文本文件 */3.2算法2:双向链表的查找stadus locateelem_dul(dulinklist l,elemtype e) /* 查找双线链表中第一个值为e的结点位置*/ p=l-next; /* p指向第一个结点 */ j=1; /* j表示结点位置 */ while(p-data!=e)&p) p=p-next; +j; /* 寻找第一个值为e的结点位置 */ if(!p) return -1; else return 1;3.3算法3:双向链表的插入status listinsert_dul(dulinklist &l,int i,elemtype e) /* 在双向链表l中的第i个位置之前插入新结点s */ p=l; /* p指向头结点 */ j=0; /* j表示结点位置 */ while(p&(jnext; +j; /* 寻找第i-1个结点位置 */ if(!p|ji-1) return error; /* 在l中确定插入位置,p=null或ji-1时,即插入位置不合法 */ if(!(s=(dulinklist)malloc(sizeof(dulnode) return error; /* 动态生成新结点失败,则返回错误 */ s-data=e; /* 给新结点的数据域赋值 */ s-next=p-next; p-next-prior=s; s-prior=p; p-next=s; /* 在双向链表中插入新结点时指针的变化 */ return 0;3.4算法4:双向链表的删除status listdelete_dul(dulinklist &l,int i,elemtype &e) /* 在双向链表l中,删除第i个结点 */ p=l-next; /* p指向第一个结点 */ int j=1; /* j表示结点位置 */ while(p&(jnext; +j; /* 寻找第i个结点 */ if(!p|ji) return error; /* 在l中确定第i个元素的位置指针p,p=null,即第i个元素不存在 */ e=p-data; /* 把指针p的数据域的值赋给e */ p-prior-next=p-next; p-next-prior=p-prior; /* 在双向链表中删除结点时指针的变化 */ free(p); /* 把结点p删掉 */ return 0;l 4.程序清单#include#includeusing namespace std;typedef struct dulnode int data; /* 数据域 */ struct dulnode *prior; /* 指向前驱的指针域 */ struct dulnode *next; /* 指向后继的指针域 */dulnode,*dulinklist;void create_dul(dulinklist &l) /*利用尾插法建立头带头结点的双向链表 */ dulinklist p,q; int i; l=(dulinklist)malloc(sizeof(dulnode); /* 生成头结点 */ l-prior=null; l-next=null; /* 头结点的指针域初始值为空 */ l-data=-1; q=l; /* 尾指针初始指向头结点 */ file* fp; /* 定义文件指针的形式 */ if(fp=fopen(h:test1.txt,r+)=null) /* 打开文本文件 */ printf(cannot open file!n); exit(0); int n; fscanf(fp,%d,&n); for(i=0;idata); /* 在文件读取结点的数据 */ p-next=null; /* 新结点指针域为空 */ p-prior=q; q-next=p; /* 尾结点指针域指向新结点 */ q=p; /* q指针后移,始终指向尾指针 */ fclose(fp); /* 关闭文本文件 */dulinklist listinsert_dul(dulinklist &l,int i,int e) /* 在双向链表l中的第i个位置之前插入新结点s */ dulinklist p,s; p=l; /* p指向头结点 */ int j=0; /* j表示结点位置 */ while(p&(jnext; +j; /* 寻找第i-1个结点位置 */ if(!p|ji-1) return null; /* 在l中确定插入位置,p=null或ji-1时,即插入位置不合法 */ if(!(s=(dulinklist)malloc(sizeof(dulnode) return null; /* 动态生成新结点失败,则返回错误 */ s-data=e; /* 给新结点的数据域赋值 */ s-next=p-next; p-next-prior=s; s-prior=p; p-next=s; /* 在双向链表中插入新结点时指针的变化 */ return 0;dulinklist listdelete_dul(dulinklist &l,int i,int &e) /* 在双向链表l中,删除第i个结点 */ dulinklist p; p=l-next; /* p指向第一个结点 */ int j=1; /* j表示结点位置 */ while(p&(jnext; +j; /* 寻找第i个结点 */ if(!p|ji) return null; /* 在l中确定第i个元素的位置指针p,p=null,即第i个元素不存在 */ e=p-data; /* 把指针p的数据域的值赋给e */ p-prior-next=p-next; p-next-prior=p-prior; /* 在双向链表中删除结点时指针的变化 */ free(p); /* 把结点p删掉 */ return 0;int locateelem_dul(dulinklist l,int e) /* 查找双线链表中第一个值为e的结点位置*/ dulinklist p; int j; p=l-next; /* p指向第一个结点 */ j=1; /* j表示结点位置 */ while(p-data!=e)&p) p=p-next; +j; /* 寻找第一个值为e的结点位置 */ if(!p) return -1; /* 返回第一个值为e的结点位置 */ else return 1;void print_dul(dulinklist l) /* 打印双向链表l */ dulinklist p; p=l; /* p指向头结点 */ while(p) printf(% d,p-data); p=p-next; /* 把双向链表中的数据都打印出来 */void save_dul(dulinklist l) file* fp; if(fp=fopen(h:test2.txt,w+)=null) printf(cannot open file!n); exit(0); while(l)fprintf(fp,%d ,l-data);l = l-next;void main() dulinklist l; int i,e,x; int pos;create_dul(l); /* 调用双向链表建立函数 */ print_dul(l); /* 调用双向链表的打印函数 */ while(1) printf(input x to choose (1.查找,2.插入,3.删除,4.0ver ): n); scanf(%d,&x); switch(x)case 1:printf(n please input the data you want to locate: n); scanf(%d,&e); /* 输入要查找的值 */ pos=locateelem_dul(l,e); /* 调用双向链表的查找函数 */ if(pos=-1) printf(the data is not found! n); else printf(the data is found! n);break;case 2: printf(please input the position you want to insert: n); scanf(%d,&i); /* 输入要插入的位置 */ printf(please input the data you want to insert: n); scanf(%d,&e); /* 输入新结点的数据 */ listinsert_dul(l,i,e); /* 调用双向链表的插入函数 */ print_dul(l); break; /* 调用双向链表的打印函数 */ case 3: printf(n please input the position you want to delete: n); scanf(%d,&i); /* 输入要删除结点的位置 */ listdelete_dul(l,i,e); /* 调用双向链表的删除函数 */ print_dul(l);break; /* 调用双向链表的打印函数 */ case 4: save_dul(l); exit(0); l 5.程序运行结果l 6.总结: 通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。理解到思路对于一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水调歌头课件
- 氢能产业园氢燃料电池电动汽车推广
- 施工人员劳动保护方案
- 园区招商引资信息化方案
- 风电场噪音控制与环境保护方案
- 人防工程建设期间安全保障方案
- 建筑工程建筑材料回收利用方案
- 水磨石镜面处理培训课件
- 中医儿科学湖北中医药高等专科学校21课件
- 2025版建筑公司劳务合作合同及员工劳动权益保护协议
- 青岛版科学 二年级《天气与动植物》
- 《养老护理员》-课件:协助老年人穿脱简易矫形器
- 影视艺术欣赏课程(教案)
- 动物的行为发育与行为遗传
- 风光储储能项目PCS舱、电池舱吊装方案
- 重庆医科大学附属第一医院改建PET-CT、PET-MR项目环评报告
- 政务服务大厅管理规范:安全与应急处置
- 双重预防机制构建-隐患排查治理(中石化中原油田天然气厂)
- 五牌一图(完整版)
- 二年级下册音乐《每天》教案
- 音乐美学.课件
评论
0/150
提交评论