1、自数据结构课程设计双向链表数据结构课程设计实验报告 题 目 双向链表 学院 专业 计算机科学与技术 班 级 学 号 学生姓名 指导教师 编写日期 2010-7-6 1.问题分析.1基本要求31.2分析过程32.数据结构描述33.算法设计.3.1算法:双向链表的建立.43.2算法2:双向链表的查找4.3算法3:双向链表的插入.53.4算法4:双向链表的删除.4.程序清单65.程序运行结果06.总结1.问题分析1.1【基本要求】:建立双向链表,并进行插入,查找,删除等操作。1.2【分析过程】:先通过创建函数建立双向链表,由文本文件提供数据。可以调用查找函数,查找与e值相同的结点是否存在;也可以通过
2、插入函数,在第i个结点前插入值为的结点,并且调节指针的变化;也可以调用删除函数,删除第i个结点,调节好指针,最后通过保存函数保留数据到文本文件中。2.数据结构描述ncludeitream#incldsn aespcest;typedef strt dlne int data; trulnode *pr; struc ulode*net; dlnode,dulilist;3.算法设计3.算法1:创建双向链表tatus edul(dulnklist ) *利用尾插法建立头带头结点的双向链表*/ l=(dulinklis)mlloc(sizef(dode); /* 生成头结点*/ lpriorNU;
3、 l-next=NLL; /*头结点的指针域初始值为空 */ -data1; q=l; * 尾指针初始指向头结点 */ IL p; / 定义文件指针的形式*/ (f=fopn(F:test1.tx,r+)=NUL) /* 打开文本文件/ pintf(cannot pen fie!n); xit(); in n; fscan(fp,%d,&); r(i=;ita); /* 在文件读取结点的数据 / p-nex=NUL; * 新结点指针域为空 * p-pror=q; qnext=; /* 尾结点指针域指向新结点*/ =p; /* q指针后移,始终指向尾指针* fclos(fp); / 关闭文本文件
4、 */3.算法2:双向链表的查找sadus locaelem_dl(dnkit l,elmypee) *查找双线链表中第一个值为e的结点位置/ p-net; /*p指向第一个结点*/ 1; /* 表示结点位置 / while(pdata!)&) =-next; +j; /* 寻找第一个值为e的结点位置*/ if(!p) return -1; ele rn 1;3.3算法3:双向链表的插入sttuslistierdul(duinklist &l,inti,eleyp e) / 在双向链表l中的第i个位置之前插入新结点s */ =l; p指向头结点*/ =0; /*表示结点位置 */ whe(p&
5、(jnext; +; / 寻找第i-1个结点位置 / if(!p|ji-1)etnRROR; / 在l中确定插入位置,p=ULL或i-1时,即插入位置不合法*/ f(!(s=(dulilist)mlloc(seof(dulnod))) return EROR; /* 动态生成新结点失败,则返回错误*/ daa=e; * 给新结点的数据域赋值 / next=nx; -ext-priors; s-ror=p; p-nexts; * 在双向链表中插入新结点时指针的变化 / retun ;34算法:双向链表的删除staus listdle_dul(duliklist&l,nt i,elemty&e)*
6、在双向链表l中,删除第i个结点 */ =l-next; /* p指向第一个结点 */ nt j1; /* j表示结点位置 while(p&(jnex; +j; / 寻找第i个结点*/ if(!p|ji) ern RROR; /* 在l中确定第个元素的位置指针p,NLL,即第个元素不存在 / e=paa; / 把指针p的数据域的值赋给e */ prio-ex=pnex; et-piop-pior; / 在双向链表中删除结点时指针的变化 */ fre(); * 把结点删掉*/ retun0;.程序清单icldeiorea#ncludpiorUL; -nextUL; /* 头结点的指针域初始值为空
7、* l-dta; q=l; /* 尾指针初始指向头结点*/ FIE*fp; 定义文件指针的形式 */ if(fp=fopen(:tes1txt,r+))=LL) /* 打开文本文件 */ pri(canot opnfil!n); exit(0); int; scaf(fp,%d,&); for(i0;idata); /* 在文件读取结点的数据 */ p-xt=ULL; /* 新结点指针域为空 / p-prio=q; qnxt; /* 尾结点指针域指向新结点 */ q=p; * q指针后移,始终指向尾指针*/ fclse(fp); / 关闭文本文件*dlklis listinr_u(dulinl
8、st ,ti,int ) /* 在双向链表l中的第i个位置之前插入新结点s/ dulinkli p,s; p=; /* p指向头结点 * in j=0; * j表示结点位置 whie(p&(ji1) trNULL; /* 在l中确定插入位置,p=UL或j-时,即插入位置不合法 */ if(!(s(dunlit)m(sizeo(dulode) rturn NULL; /* 动态生成新结点失败,则返回错误 sdt=; /* 给新结点的数据域赋值 */ s-next=p-next; -nt-prio=s; s-prir=; pex=s; / 在双向链表中插入新结点时指针的变化*/ rern 0;du
9、lnst istdete_u(dulinkist&l,i i,it e) /* 在双向链表中,删除第个结点 / dulnklistp; p-e; /*指向第一个结点* int j=1; /* j表示结点位置*/ whe(p(ji) returNULL; /* 在l中确定第i个元素的位置指针p,p=NL,即第个元素不存在 */ e=p-daa; /* 把指针p的数据域的值赋给e * p-prior-xt=p-ext; pnext-pi=p-prr; 在双向链表中删除结点时指针的变化* fre(p); / 把结点p删掉 / reun;int locatel_ul(dulinkist l,n e)
10、/ 查找双线链表中第一个值为e的结点位置 duinklist p; nt j; p=-nex; / p指向第一个结点 */ =1; j表示结点位置 / whi(pdata!e)&p) p=pnext; +j; /* 寻找第一个值为e的结点位置 */ if(!p) return-1; /* 返回第一个值为的结点位置 * ele turn 1;voidprint_dl(dliklst l) /* 打印双向链表*/ dulnklist p; =; * p指向头结点 */ hi(p) inf( d,p-ata); p=pex; /* 把双向链表中的数据都打印出来 void avedu(uilst l)
11、 FE f; if(p=fopen(H:test2tx,w+))=NUL) prit(canotpen ie!); xit(0); wle(l) fprintf(fp,%d ,l-ta); l= l-next;void main() dulilst l; int ,e,x; nt pos;create_u(l); 调用双向链表建立函数 / rin_dul(l); / 调用双向链表的打印函数 * hile(1) prntf(nut x to cooe(1.查找,2.插入,3.删除,4.ver ): ); anf(%d,x); itch()se 1: printf(n pease ut the t
12、a you nt t lcate:); sanf(%d,&); /* 输入要查找的值 */ pos=locateem_ul(l,e); * 调用双向链表的查找函数 / if(pos=-1) rif(Thd i nt foud! n); ese rintf(The at is fund! n);rk; cas 2: prnf(please input hposiionyo want t insert: n); snf(%d,&i); /* 输入要插入的位置 / prntf(plese inp th ta y wantto insrt: ); scaf(d,&e); /输入新结点的数据*/ ist
13、inrt_du(l,i,e); /* 调用双向链表的插入函数 */ pin_dul(l); break; /*调用双向链表的打印函数 / case3: prinf(pas nput te pstion you wnt todelee: ); scnf(%d,&); /* 输入要删除结点的位置*/ istdeee_dul(l,i,); /*调用双向链表的删除函数* print_du();bre; /*调用双向链表的打印函数 */ cas : sedul(); exit(0); .程序运行结果6.总结: 通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。缺乏完整的思路,尽管语法正确,程序还是无法执行。数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1