西北工业大学数据结构试验报告DS01
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
◎实验题目:合并两个链表
◎实验目的:设计合适的数据结构,熟悉链表的构造、合并和输出。
◎实验内容:通过算法实现,构造合适的数据结构,通过输入获得A和B两个有序循环链表,将这两个链表按元素的大小顺序排列合并成一个有序循环链表并输出,例如输入A链表为:1 3 5 7 9,B链表为2 4 6 8 10,的合成的C链表为
1 2 3 4 5 6 7 8 9 10。
一、需求分析
1.本程序演示中,链表A和链表B的长度m ,n是任意的,开始时输入链表长度,计算机根据此链表创建循环链表,并由人输入链表数据,之后计算机将两链表合并成一个链表C。
2. 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信
息”之后,由用户在键盘上输入相应数据(链表长度和链表中数据)。3.程序执行的命令包括:
(1)构造链表;(2)输入数据;(3)进行链表的合并操作;(4)输出链;
(5)结束。
4、测试数据:
第一组:A链表长度:5,A链表数据:1 3 5 7 9
B链表长度:5,B链表数据:2 4 6 8 10
合并的C链表为:1 2 3 4 5 6 7 8 9 10;
第二组:A链表长度:4,A链表数据:2 5 6 8
A链表长度:5,A链表数据:1 4 7 9 14
合并的C链表为:1 2 4 5 6 7 8 9 14
第三组:A链表长度:5,A链表为:1 2 4 6 8
B链表长度:5,B链表为:1 3 4 5 9
合并的C链表为:1 2 3 4 5 6 8 9
二概要设计
为实现上述算法,选择循环单链表为本程序的存储结构。
1、基本操作:
creat()
操作结果:构造循环单链表,并通过输入将数据输入链表
combine()
初始条件:循环单链表已经存在
操作结果:将两个链表有序合并为一个链表
2、本程序包括三个模块:
(1)主程序模块
(2)构造链表模块
(3)链表合并模块
3、模块调用关系图
三详细设计
1、定义存储链表结构:
(1)定义链表结点与指针结构:
typedef struct LNODE //*定义链表结点结构*//
{
int num;
struct LNODE *next;
}lnode,*Linklist;
2、每个模块的分析:
(1)主程序模块:
void main()
{
Linklist l1,l2,l3; //*定义链表头指针*// int m,n;
lnode *p;
printf("请输入链表A的长度:\n");
scanf("%d",&m);
printf("请输入链表A元素:\n");
l1=creat(m);
printf("请输入链表B的长度:\n");
scanf("%d",&n);
printf("请输入链表B元素:\n");
l2=creat(n);
printf("合并的链表为:\n");
l3=combine(l1,l2); //*合并两个链表*//
p=l3->next; //*输出合并成的链表*//
while(p!=l3)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
(2)构造链表模块:
lnode *creat(int t) //*创建循环单链表*//
{ int i;
lnode *l;
lnode *p,*q;
l=(lnode*)malloc(sizeof(lnode));
p=(lnode*)malloc(sizeof(lnode));
q=l;
for(i=0;i { scanf("%d",&(p->num)); //*为链表输入数据*// q->next=p; q=p; p=(lnode*)malloc(sizeof(lnode)); } q->next=l; //*链表尾部指针指向头结点*// return(l); //*返回链表头指针*// } (3)链表合并模块: lnode *combine(lnode*l1,lnode*l2) //*链表合并函数*// { Linklist l3; lnode *p1,*p2,*p3,*p; p1=l1->next; p2=l2->next; l3=(lnode *)malloc(sizeof(lnode)); p3=l3; l3->next=l3; while(p1!=l1&&p2!=l2) { if(p1->num==p2->num) { p=(lnode *)malloc(sizeof(lnode)); p->num=p1->num; p->next=p3->next; p3->next=p; p3=p; p1=p1->next; p2=p2->next; } else if(p1->num < p2->num) { p=(lnode *)malloc(sizeof(lnode)); p->num=p1->num; p->next=p3->next; p3->next=p; p3=p; p1=p1->next; } else { p=(lnode *)malloc(sizeof(lnode)); p->num=p2->num;