数据结构课程设计双向链表

上传人:a**** 文档编号:121639337 上传时间:2022-07-19 格式:DOC 页数:11 大小:83.50KB
返回 下载 相关 举报
数据结构课程设计双向链表_第1页
第1页 / 共11页
数据结构课程设计双向链表_第2页
第2页 / 共11页
数据结构课程设计双向链表_第3页
第3页 / 共11页
点击查看更多>>
资源描述
数据结构课程设计实验报告 题 目 双向链表 学 院 专 业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 编写日期 2010-7-16 目录1. 问题分析.3.3.32. 数据结构描述.33. 算法设计.43.1算法1:双向链表的建立.43.2算法2:双向链表的查找43.3算法3:双向链表的插入.53.4算法4:双向链表的删除.54. 程序清单65. 程序运行结果106. 总结11l 1.问题分析【基本要求】:建立双向链表,并进行插入,查找,删除等操作。【分析过程】:先通过创建函数建立双向链表,由文本文件提供数据。可以调用查找函数,查找与e值相同的结点是否存在;也可以通过插入函数,在第i个结点前插入值为e的结点,并且调节指针的变化;也可以调用删除函数,删除第i个结点,调节好指针,最后通过保存函数保留数据到文本文件中。l 2.数据结构描述#include#includeusing namespace std;typedef struct dulnode int data; struct dulnode *prior; struct dulnode *next; dulnode,*dulinklist;l算法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); /* 关闭文本文件 */算法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:双向链表的插入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;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#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); ll 6.总结: 通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。缺乏完整的思路,尽管语法正确,程序还是无法执行。数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!