双向链表的排序实验报告

上传人:汽*** 文档编号:569059552 上传时间:2023-06-20 格式:DOC 页数:10 大小:51KB
返回 下载 相关 举报
双向链表的排序实验报告_第1页
第1页 / 共10页
双向链表的排序实验报告_第2页
第2页 / 共10页
双向链表的排序实验报告_第3页
第3页 / 共10页
双向链表的排序实验报告_第4页
第4页 / 共10页
双向链表的排序实验报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《双向链表的排序实验报告》由会员分享,可在线阅读,更多相关《双向链表的排序实验报告(10页珍藏版)》请在金锄头文库上搜索。

1、陈祎智11004530实验报告1问题描述:双向链表的排序。要求:输入一个双向链表,显示些双向链表并对此双向链表排序2课题分析(结构图):双向链表的排序双向链表存储结构输入数据结点快速排序定义3数据结构的设计:typedefstructnodeintinfo;structnode*llink,*rlink;NODE;4流程图开始创建链表初始化链表从中间分成两部插入10个值排序链表输出排序链表终止5源程序:#include#include#includetypedefstructLink/*双向链表结构体*/intdata;structLink*lift;structLink*right;link

2、x,*linky;linkyInit();/*建立双向链表*/voidPrLink(linkyp);/*输出双向链表*/linkySort(linkyhead);/*对双向链表排序*/linkySwap(linkyhead,linkyone,linkytwo);/*任意交换双向链表两个结点的地址*/voidmain(void)linkyhead;head=Init();head=Sort(head);PrLink(head);linky(Init()/*建立链表*/linkyp,q,head;intn=0;head=p=q=(linky)malloc(sizeof(linkx);printf(

3、排序前的链表:);scanf(%d,&p-data);/*输入数据*/head-lift=NULL;n+;while(n!=10)/*直输入到规定的数字个数停止*/q=p;p=(linky)malloc(sizeof(linkx);scanf(%d,&p-data);/*输入数据*/q-right=p;p-lift=q;n+;p-right=NULL;return(head);linkySwap(linkyhead,linkyone,linkytwo)/*任意交换两个结点*/linkytemp;if(one-lift=NULL&two-right=NULL)/*首和尾巴的交换*/if(one-

4、right=two)/*只有两个结点的情况下*/two-right=one;two-lift=NULL;one-lift=two;one-right=NULL;head=two;else/*有间隔的首尾交换*/one-right-lift=two;two-lift-right=one;two-right=one-right;one-lift=two-lift;two-lift=one-right=NULL;head=two;/*尾结点成为头结点*/elseif(two-right=NULL)/*尾和任意一个交换*/if(one-right=two)/*交换最后两个结点*/one-lift-ri

5、ght=two;two-lift=one-lift;two-right=one;one-lift=two;one-right=NULL;else/*和前面其他结点交换*/temp=two-lift;temp-right=one;one-lift-right=two;one-right-lift=two;two-lift=one-lift;two-right=one-right;one-lift=temp;one-right=NULL;elseif(one-lift=NULL)/*头和任意一个交换*/if(one-right=two)/*交换头两个结点*/two-right-lift=one;o

6、ne-right=two-right;one-lift=two;two-right=one;two-lift=NULL;head=two;else/*头结点和后面其他结点交换*/temp=one-right;temp-lift=two;one-lift=two-lift;one-right=two-right;two-lift-right=one;two-right-lift=one;two-right=temp;two-lift=NULL;head=two;/*交换的结点成为头结点*/else/*当中的任意两个交换*/if(one-right=two)/*交换连在一起的两个结点*/temp=

7、one-lift;one-lift-right=two;one-right-lift=two;one-lift=two;one-right=two-right;two-right-lift=one;two-right=one;two-lift=temp;else/*交换隔开的两个结点*/one-lift-right=two;one-right-lift=two;one-lift=two-lift;temp=one-right;one-right=two-right;two-lift-right=one;two-right-lift=one;two-right=temp;two-lift=one

8、-lift;return(head);linkySort(linkyhead)/*对链表排序*/linkyi,j,t,p;intmax;p=head;for(i=p;i-right!=NULL;i=i-right)/*用选择法的思想对这些结点排序*/max=i-data;for(j=i-right;j!=NULL;j=j-right)if(j-datadata;t=j;if(max!=i-data)/*假如没有找到比i小的结点*/head=Swap(head,i,t);/*因为最终返回的是头结点,而头结点又有可能变化,所以每次头结点返回*/i=t;return(head);voidPrLink

9、(linkyp)/*输出链表*/linkyq;printf(排序后:);doq=p;printf(%d,p-data);p=p-right;free(q);/*释放输出结点*/while(p!=NULL);6调试记录:第一次输入136134158123197124156170103101实现排序c*C:DocuentsandSettIngsAdinistratorDebugCpp3.exe*因E库启:101183123124134136156158170197Pressanijke.entsandSettingsAdinis-tratorDebugCpp3.eze*腓序前的链表:1584212

10、564137294987515461542315794546121543常E序后:154315461256413467137291542315794158424987554612PressanytocontinLie第二次调试输入1236715842125641372949875154615423157945461215437软件说明程序调试运行成功后,排序前随机输入十个不同的数值,快速排序后将由小到大输出这十个数值的排序。如上图说明8.设计总结一周的上机实践课程结束了,我们也按要求完成了实践内容,这次上机实践使我巩固了所学的计算机知识,对C语言知识有了更进一步的了解。但是知识是学无止境的,我相信,这次的课程设计对我以后在计算机编程这方面有很好的指导意义,让我通过这次实践了解到计算机编程的冰山一角。我此次设计的双向链表的排序程序虽然比较典型,对我们认识数据结构和C程序设计却有很好的帮助。在设计中我遇到了很多编程方面的难点,在老师的辛勤指导和同学们的热心帮助下,我慢慢的找到了解决问题的方法。在老师的指导下我学到很多实用的知识,在此表示感谢!感谢老师和同学们的帮助和支持。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号