两线性表的合并 数据结构实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2. 程序执行的命令包括: (1)构造线性表 A (2)构造线性表 B (3)求两张表的并 (4)删除 C 中值相同的元 素 (5)将已合并的线性表进行逆序排列
二、概要设计
⒈ 为实现上述算法,需要线性表的抽象数据类型: ADT Stack { 数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n≥0} 基本操作: initlist(& L) 操作结果:构造一个空的线性表 L。 ListLength(L) 初始条件:线性表 L 已经存在 操作结果:返回 L 中数据元素的个数。 LocateElem(List *La,ElemType e,int type) 初始条件:线性表 La 已经存在 操作结果:判断 La 中是否有与 e 相同的元素。 MergeList(La,Lb,&Lc) 初始条件:非递减线性表 La,Lb 已经存在 操作结果:合并 La,Lb 得到 Lc,Lc 仍按非递增有序排列。 UnionList(List *La ,List *Lb) 初始条件:线性表 La,Lb 已经存在 操作结果:将所有在 Lb 而不在 La 中的元素插入到 La 中表尾的位置。 PrintList(L) 初始条件:线性表 L 已经存在 操作结果:打印出表 L。
int *a; int length; int listsize; }sqlist ;
sqlist la,lb,lc; /*建立一个空表*/ sqlist initlist() {
sqlist l; l.a=(int*)malloc(listinitsize*sizeof(int)); if(!l.a)
printf("%6d",l.a[i]); printf("\n"); } /*删除线性表中的相同的元素*/ sqlist delsame(sqlist L) { int i,j,k; if(L.length>0) {
j=0; for(i=1;i<L.length;i++)
{ k=0; while(k<=j && L.a[k]!=L.a[i]) k++; if(k==j+1) L.a[j++]=L.a[i];
} } L.length=j; return L; } /*将线性表进行逆序排列*/ sqlist change(sqlist l) { int i,t; for(i=1;i<=l.length/2;i++)
{ t=l.a[i];
8
l.a[i]=l.a[l.length-i]; l.a[l.length-i]=t; } return l; } /*主函数*/ main() { int num,num0; int p; int i,j; la=initlist(); lb=initlist(); lc=initlist(); printf("Please input the numlbers of you want albout La:"); scanf("%d",&num); printf("\n"); creatlist(la,num); printf("\nPlease input the numlbers of you want albout Lb:"); scanf("%d",&num0); printf("\n"); creatlist(lb,num0); printf("The list of La:\n"); printlist(la); printf("The list of Lb:\n"); printlist(lb); addlist(la,lb,lc); delsame(lc); change(lc); printf("The list of Lc:\n"); printlist(lc); }
{ if(la.a[i]<=lb.a[j])
2
{ lc.a[k]=lb.a[i]; i++; k++; } else { lc.a[k]=la.a[j]; j++; k++; } } while(i<=la.length) { lc.a[k]=la.a[i]; k++; i++; } while(j<=lb.length) { lc.a[k]=lb.a[j]; k++; j++; } lc.length=k-1; return lc; } void printlist(sqlist l) { int i=1; for(i=1;i<=l.length;i++) printf("%6d",l.a[i]); printf("\n"); }/*打印线性表*/ sqlist delsame(sqlist L) { int i,j,k; if(L.length>0) { j=0; for(i=1;i<L.length;i++) { k=0; while(k<=j && L.a[k]!=L.a[i])
4
delsame(lc); change(lc); printf("The list of Lc:\n"); printlist(lc);
}4 函数调用关系
main
initlist
delsame
addlist
creatlist
change
printlist
printlist
四、调试分析
⒈ 刚开始输入时,漏掉了一些变量参数的标记"&",有的则错加了"&",使得程序运行出来 的结果不正确,使调试程序时费时不少。
⒉ 在初次编好后,每次运行时发现第一次输入的数据必须要多了,导致线性表有点混乱, 最后发现是输入语句都多了一个“\n”所导致的,删除后就正常了。
3.程序采用逐个输入的方法创建 La,Lb,在元素较多时,会使得程序很庞大,不利于检查错
误等。
4. 算法的时空分析
各操作的算法时间复杂度比较合理 initlist 为 O(1)printList,delsame,change,creatlist 为 O(l.length), addList 为 O(la.length*lb.length)。
六、测试结果
在 TC2.0 中运行得到的结果如下图所示:
5
七、附录:源程序 #include<stdio.h> #include<malloc.h>
#define listinitsize 100 #define OVERFLOW -1
/*线性表的定义*/ typedef struct sqlist {
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使
调试也较顺利,各模块有较好的可重用性。
五、用户手册
⒈ 本程序的运行环境为 windows xp 操作系统,并且在 TC2.0 中运行,执行文件为 Exp1Prb1.c;
⒉ 进入演示程序后,完成编译,连接(即同时按下 Ctrl F9)进入演示界面,用户键入任 一符号,都能看完整个演示过程。
三、详细设计
⒈元素类型,结点类型 typedef struct sqlist {
int *a; int length; int listsize; }sqlist; sqlist la,lb,lc; sqlist initlist(){ sqlist l; l.a=(int*)malloc(listinitsize*sizeof(int)); if(!l.a) exit(OVERFLOW); l.length=0; l.listsize=listinitsize; return l;} 2.对抽象数据类型中的部分基本操作的伪码算法如下: sqlist addlist( sqlist la, sqlist lb, sqlist lc) /*合并两顺序表*/ { int i=1,j=1,k=1; while(i<=la.length && j<=lb.length)
1
ListInsert(List *L, int i, struct STU e) 初始条件:线性表 L 已经存在,1≤i≤ListLength(&L)+1 操作结果:在表 L 中第 i 个位置前插入元素 e,L 的长度加 1。
}ADT List
2. 本程序有三个模块: ⑴ 主程序模块 main(){ 初始化; { 接受命令; 显示结果; } } ⑵ 线性表单元模块:实现线性表抽象数据类型; ⑶ 结点结构单元模块:定义线性表中的结点结构。
3
k++; if(k==j+1)
L.a[j++]=L.a[i]; } } L.length=j; return L; } /*删除线性表中的相同的元素*/ sqlist change(sqlist l) { int i,t; for(i=1;i<=l.length/2;i++) { t=l.a[i]; l.a[i]=l.a[l.length-i]; l.a[l.length-i]=t; } return l; } /*将线性表进行逆序排列*/ 3.主函数和其他函数的伪码算法 main() { int num,num0; int p; int i,j; la=initlist(); lb=initlist(); lc=initlist(); printf("Please input the numlbers of you want albout La:"); scanf("%d",&num); printf("\n"); creatlist(la,num); printf("\nPlease input the numlbers of you want albout Lb:"); scanf("%d",&num0); printf("\n"); creatlist(lb,num0); printf("The list of La:\n"); printlist(la); printf("The list of Lb:\n"); printlist(lb); addlist(la,lb,lc);
} while(i<=la.length)
{ lc.a[k]=la.a[i]; k++; i++; } while(j<=lb.length) { lc.a[k]=lb.a[j]; k++; j++;
7
} lc.length=k-1; return lc; } /*打印线性表*/ void printlist(sqlist l) { int i=1; for(i=1;i<=l.length;i++)
} }
/*wenku.baidu.com并两线性表*/ sqlist addlist( sqlist la, sqlist lb, sqlist lc) {
int i=1,j=1,k=1; while(i<=la.length && j<=lb.length)
{ if(la.a[i]<=lb.a[j]) { lc.a[k]=lb.a[i]; i++; k++; } else { lc.a[k]=la.a[j]; j++; k++; }
南昌航空大学实验报告
课程名称: 数据结构
班 级:
指导教师评定:
签
实验名称: 学生姓名: 名:
实验一 线性表的顺序存储结构
学号:
题目:有两张非递减有序的线性学生表 A,B,采用顺序存储结构,两张表合并用 c 表存, 要求 C 仍为非递减有序的,并删除 C 中值相同的表。
一、 需求分析
1. 用户可以根据自己的需求分别输入两个整型的线性表,有必要的话可以通过源程序改变 是否为整型,再进行输入。
9
exit(OVERFLOW); l.length=0; l.listsize=listinitsize; return l; }
sqlist creatlist(sqlist l,int num) {
int j; int p;
6
for(j=1;j<=num;j++) {
scanf("%d",&p); la.a[j]=p; la.length++;
二、概要设计
⒈ 为实现上述算法,需要线性表的抽象数据类型: ADT Stack { 数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n≥0} 基本操作: initlist(& L) 操作结果:构造一个空的线性表 L。 ListLength(L) 初始条件:线性表 L 已经存在 操作结果:返回 L 中数据元素的个数。 LocateElem(List *La,ElemType e,int type) 初始条件:线性表 La 已经存在 操作结果:判断 La 中是否有与 e 相同的元素。 MergeList(La,Lb,&Lc) 初始条件:非递减线性表 La,Lb 已经存在 操作结果:合并 La,Lb 得到 Lc,Lc 仍按非递增有序排列。 UnionList(List *La ,List *Lb) 初始条件:线性表 La,Lb 已经存在 操作结果:将所有在 Lb 而不在 La 中的元素插入到 La 中表尾的位置。 PrintList(L) 初始条件:线性表 L 已经存在 操作结果:打印出表 L。
int *a; int length; int listsize; }sqlist ;
sqlist la,lb,lc; /*建立一个空表*/ sqlist initlist() {
sqlist l; l.a=(int*)malloc(listinitsize*sizeof(int)); if(!l.a)
printf("%6d",l.a[i]); printf("\n"); } /*删除线性表中的相同的元素*/ sqlist delsame(sqlist L) { int i,j,k; if(L.length>0) {
j=0; for(i=1;i<L.length;i++)
{ k=0; while(k<=j && L.a[k]!=L.a[i]) k++; if(k==j+1) L.a[j++]=L.a[i];
} } L.length=j; return L; } /*将线性表进行逆序排列*/ sqlist change(sqlist l) { int i,t; for(i=1;i<=l.length/2;i++)
{ t=l.a[i];
8
l.a[i]=l.a[l.length-i]; l.a[l.length-i]=t; } return l; } /*主函数*/ main() { int num,num0; int p; int i,j; la=initlist(); lb=initlist(); lc=initlist(); printf("Please input the numlbers of you want albout La:"); scanf("%d",&num); printf("\n"); creatlist(la,num); printf("\nPlease input the numlbers of you want albout Lb:"); scanf("%d",&num0); printf("\n"); creatlist(lb,num0); printf("The list of La:\n"); printlist(la); printf("The list of Lb:\n"); printlist(lb); addlist(la,lb,lc); delsame(lc); change(lc); printf("The list of Lc:\n"); printlist(lc); }
{ if(la.a[i]<=lb.a[j])
2
{ lc.a[k]=lb.a[i]; i++; k++; } else { lc.a[k]=la.a[j]; j++; k++; } } while(i<=la.length) { lc.a[k]=la.a[i]; k++; i++; } while(j<=lb.length) { lc.a[k]=lb.a[j]; k++; j++; } lc.length=k-1; return lc; } void printlist(sqlist l) { int i=1; for(i=1;i<=l.length;i++) printf("%6d",l.a[i]); printf("\n"); }/*打印线性表*/ sqlist delsame(sqlist L) { int i,j,k; if(L.length>0) { j=0; for(i=1;i<L.length;i++) { k=0; while(k<=j && L.a[k]!=L.a[i])
4
delsame(lc); change(lc); printf("The list of Lc:\n"); printlist(lc);
}4 函数调用关系
main
initlist
delsame
addlist
creatlist
change
printlist
printlist
四、调试分析
⒈ 刚开始输入时,漏掉了一些变量参数的标记"&",有的则错加了"&",使得程序运行出来 的结果不正确,使调试程序时费时不少。
⒉ 在初次编好后,每次运行时发现第一次输入的数据必须要多了,导致线性表有点混乱, 最后发现是输入语句都多了一个“\n”所导致的,删除后就正常了。
3.程序采用逐个输入的方法创建 La,Lb,在元素较多时,会使得程序很庞大,不利于检查错
误等。
4. 算法的时空分析
各操作的算法时间复杂度比较合理 initlist 为 O(1)printList,delsame,change,creatlist 为 O(l.length), addList 为 O(la.length*lb.length)。
六、测试结果
在 TC2.0 中运行得到的结果如下图所示:
5
七、附录:源程序 #include<stdio.h> #include<malloc.h>
#define listinitsize 100 #define OVERFLOW -1
/*线性表的定义*/ typedef struct sqlist {
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使
调试也较顺利,各模块有较好的可重用性。
五、用户手册
⒈ 本程序的运行环境为 windows xp 操作系统,并且在 TC2.0 中运行,执行文件为 Exp1Prb1.c;
⒉ 进入演示程序后,完成编译,连接(即同时按下 Ctrl F9)进入演示界面,用户键入任 一符号,都能看完整个演示过程。
三、详细设计
⒈元素类型,结点类型 typedef struct sqlist {
int *a; int length; int listsize; }sqlist; sqlist la,lb,lc; sqlist initlist(){ sqlist l; l.a=(int*)malloc(listinitsize*sizeof(int)); if(!l.a) exit(OVERFLOW); l.length=0; l.listsize=listinitsize; return l;} 2.对抽象数据类型中的部分基本操作的伪码算法如下: sqlist addlist( sqlist la, sqlist lb, sqlist lc) /*合并两顺序表*/ { int i=1,j=1,k=1; while(i<=la.length && j<=lb.length)
1
ListInsert(List *L, int i, struct STU e) 初始条件:线性表 L 已经存在,1≤i≤ListLength(&L)+1 操作结果:在表 L 中第 i 个位置前插入元素 e,L 的长度加 1。
}ADT List
2. 本程序有三个模块: ⑴ 主程序模块 main(){ 初始化; { 接受命令; 显示结果; } } ⑵ 线性表单元模块:实现线性表抽象数据类型; ⑶ 结点结构单元模块:定义线性表中的结点结构。
3
k++; if(k==j+1)
L.a[j++]=L.a[i]; } } L.length=j; return L; } /*删除线性表中的相同的元素*/ sqlist change(sqlist l) { int i,t; for(i=1;i<=l.length/2;i++) { t=l.a[i]; l.a[i]=l.a[l.length-i]; l.a[l.length-i]=t; } return l; } /*将线性表进行逆序排列*/ 3.主函数和其他函数的伪码算法 main() { int num,num0; int p; int i,j; la=initlist(); lb=initlist(); lc=initlist(); printf("Please input the numlbers of you want albout La:"); scanf("%d",&num); printf("\n"); creatlist(la,num); printf("\nPlease input the numlbers of you want albout Lb:"); scanf("%d",&num0); printf("\n"); creatlist(lb,num0); printf("The list of La:\n"); printlist(la); printf("The list of Lb:\n"); printlist(lb); addlist(la,lb,lc);
} while(i<=la.length)
{ lc.a[k]=la.a[i]; k++; i++; } while(j<=lb.length) { lc.a[k]=lb.a[j]; k++; j++;
7
} lc.length=k-1; return lc; } /*打印线性表*/ void printlist(sqlist l) { int i=1; for(i=1;i<=l.length;i++)
} }
/*wenku.baidu.com并两线性表*/ sqlist addlist( sqlist la, sqlist lb, sqlist lc) {
int i=1,j=1,k=1; while(i<=la.length && j<=lb.length)
{ if(la.a[i]<=lb.a[j]) { lc.a[k]=lb.a[i]; i++; k++; } else { lc.a[k]=la.a[j]; j++; k++; }
南昌航空大学实验报告
课程名称: 数据结构
班 级:
指导教师评定:
签
实验名称: 学生姓名: 名:
实验一 线性表的顺序存储结构
学号:
题目:有两张非递减有序的线性学生表 A,B,采用顺序存储结构,两张表合并用 c 表存, 要求 C 仍为非递减有序的,并删除 C 中值相同的表。
一、 需求分析
1. 用户可以根据自己的需求分别输入两个整型的线性表,有必要的话可以通过源程序改变 是否为整型,再进行输入。
9
exit(OVERFLOW); l.length=0; l.listsize=listinitsize; return l; }
sqlist creatlist(sqlist l,int num) {
int j; int p;
6
for(j=1;j<=num;j++) {
scanf("%d",&p); la.a[j]=p; la.length++;