1、数据结构实验报告班级:js001004 姓 名:王云 学 号:2010300102 E-mail: 日期:2012/10/10实验题目:合并两个有序循环链表。实验目的:学会建立有序循环链表,并进行链的相关操作。实验内容:建立为两个带有头结点的有序循环链表,将这两个链表合并为一个带头结点的有序循环链表。一、需求分析1、本演示程序中,要建立的两个链表节点数目 n 是任意的,首先输入一个值给要建立的节点数,然后按从小到大的顺序依次输入每个节点的数值。程序应能自动保存每个链表的节点数目和每个节点的数值。程序将两个链表合并为一个节点值从小到大排列的链表。2、演示程序以用户和计算机的对话方式执行,即在计算
2、机终端显示“提示信息”之后,由用户在键盘输入相应数据(即要建立链表的节点数目和每个节点的数值) ,链表由程序自动生成,并完成合并。3、程序执行的命令包括:(1)构造链表;(2)输入数据;(3)合并成新的链表;(4)输出链表;(5)结束。4、数据测试第一个链表 n=3,每个节的点数据依次是 1 3 5;第二个链表 n=4,每个节点的数据 2 4 6 7;则正确的输出为 1 2 3 4 5 6 7。二、概要设计为了实现上述操作,应以单项循环链表为存储结构。1、基本操作Jianli ( )操作结果:建立一个单项循环链表;Shuchu ( )操作结果:输出单项循环链表;Hebing ( )操作结果:实
3、现连个单项循环链表合并为一个单项循环链表。2、本程序包括四个模块:(1) 构造链表模块;(2) 输出链表模块;(3) 合并链表模块;(4) 主程序模块。3、主程序流程:构造两个链表依次输出两个链表 两个链表的合并 输出合并链表4、模块间层次关系主函数模块建立函数模块 输出函数模块 合并函数模块三、详细设计1、元素类型、节点类型和指针类型/链表定义/typedef int ElemType;typedef struct LnodeElemType data; /存储数据struct Lnode *next; /存数下一个节点的坐标LinkList;2、每个模块的分析(1) 构造链表并输入每个节点
4、数据模块void jianli(LinkList *int i; / /建立循环链表L=(LinkList *)malloc(sizeof(LinkList);L-next=L; r=L;for(i=0;idata);r-next=s;r=s; r-next=L;(2) 输出链表模块void shuchu(LinkList *L)LinkList *p=L-next;/ 输出链表数据while (p!=L)printf(“%d “,p-data);p=p-next; printf(“n“);(3)合并链表模块void hebing(LinkList *list1,LinkList *list2
5、,LinkList */建立新的链表list3=(LinkList *)malloc(sizeof(LinkList);list3-next=list3;p3=list3;p1=list1-next;p2=list2-next;/两个链表均有值时的比较两个值的大小后从小到大连入新链表内while(p1!=list1p1=p1-next;p3=p3-next;elsep3-next=p2;p2=p2-next;p3=p3-next;/一个链表结束一个未结束将未结束链表连到新链表中if(p2=list2)p3-next=p1;if(p1=list1)p3-next=p2;/两个链表均结束连回头结点
6、while(p2=list2)p3=p3-next;if(p3-next=list1)break;while(p1=list1)p3=p3-next;if(p3-next=list2)break;p3-next=list3;(3) 主程序模块int main()LinkList *list1,*list2,*list3;int n1,n2;/建立两个链表并输出printf(“输入要建立的 list1 结点个数:n“);scanf(“%d“,jianli(list1,n1); /调用函数 jianliprintf(“输入要建立的 list2 结点个数:n“);scanf(“%d“,jianli(
7、list2,n2); /调用函数 jianliprintf(“list1:“);shuchu(list1); /调用函数 shuchuprintf(“list2:“);shuchu(list2); /调用函数 shuchu /合并形成新链表hebing(list1,list2,list3); /调用函数 hebingprintf(“list3:“);shuchu(list3); /调用函数 shuchu return 0;3、函数调用关系图main( )调用 jianli( )调用 jianli( )调用 shuchu( )调用 shuchu( )调用 hebing( )调用 shuchu(
8、)四、程序使用说明和测试结果1、程序使用说明(1)本程序的运行环境为 Codeblock;(2)进入演示程序即显示提示信息:输入要建立的 list1 结点个数:输入新节点的数据:输入要建立的 list2 结点个数:输入新节点的数据:list1:list2:list3:2、测试结果当 list1 节点数为 3,新节点数据依次为 1 3 5;list2 节点数为 3,节点数一次为2 4 6;则输出为 1 2 3 4 5 6。3、调试中的错误及解决方法错误:在一个链表结束时,另一个链表中的剩余数值不能进入合并链表中。解决:在纸上模拟链表的合并,寻找错误,发现为指针的指向存在问题。在一个链表结束后,另
9、一个链表剩余项虽有指针指向,但只指向了第一个剩余项而未继续向后移动指针,导致未能连入。修改错误的指针指向即解决错误。4、运行界面五、实验总结此次实验过程用时三个小时。最初半个小时在回忆老师上课的有关讲解,并在纸上设计算法。随后在计算机上敲入代码并进行初次的验证,发现存在的编写错误并改正,大致用时一个小时。程序无错误但运行出现当一个链表结束时,另一个链表剩余项无法连入的错误显示。起初在程序上逐段调试改,发现为合并函数存在问题。然后再纸上开始进行模拟合并函数,模拟过程开始时中由于仍按编写之前的思路走,没有发现错误。由于是用指针的链接方法来实现合并,随后开始思考指针的指向与链接问题。经过半个小时的思考,最终发现在出现问题的地方指针没有继续向后链接移动导致问题的出现,随后开始修改程序实现合并。此次的程序编写我认识到正确的算法在编程中起到事半功倍的效果,在开始编写程序之前一定要自习考虑好自己的算法,这样可以极大地减少编程调试修改错误所需要的时间。在后边的实验课中,应认真考虑好算法后进行编程。