1、操作结果:构造一个空的线性表L。InputList(List *L)初始条件:线性表L已经存在人工输入了一张表。 CheckList(List *L)判断L是否非递增有序,若为否,则重新输入。MergeList(List *La,List *Lb,List *Lc)非递增线性表La,Lb已经存在合并La,Lb得到Lc,Lc仍按非递增有序排列。DeleteSame(List *L)非递增线性表L已经存在删除了L中值相同的元素。PrintList(List L)打印出表L。 ADT List2. 本程序有三个模块: 主程序模块void main()初始化;do接受命令;显示结果;while(执行完
2、毕) 线性表单元模块:实现线性表抽象数据类型; 结点结构单元模块:定义线性表中的结点结构。三、详细设计元素类型,结点类型typedef int ElemType; /元素类型struct LIST ElemType *elem; int length; int listsize; ;typedef struct LIST list; /结点类型2.对抽象数据类型中的部分基本操作的伪码算法如下:int init(List *L) /初始化表L Lelem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);/为线性表顺序结构分配空间 If(!L
3、elem) exit (ERROR); Llength=0; Llistsize= LIST_INIT_SIZE; Return OK;/init Listvoid InputList(List *L) /构造表 int flag=-32768;/输入结束的标志 scanf(%d,&n); /输入元素 while(n!=flag) /继续输入 Lelemj+=n; Llength=j; Scanf( /InputListvoid CheckList(List *L) for (i=0;iLlength-1;i+) if (LelemiLelemi+1) InputList(L);/输入为递增时
4、,要重新输入 i=0;/CheckListvoid MergeList(List *La, List *Lb, List *Lc) /表La和Lb合并为Lc Pa=Laelem;pb=Lbelem;/pa,pb分别指向La,Lb的第一个元素 LcListsize= Lalength+Lblength; Lcelem=(ElemType *)malloc(Lclistsize*sizeof(ElemType); pc=Lcelem;/pc指向表Lc的第一个元素 pa_last=Laelem+Lalength-1;/表La最后一个元素的地址 pb_last=Lbelem+Lblength-1;/
5、表Lb最后一个元素的地址 while (pa=pa_last&pb=pb_last)/表La,Lb都未操作完时 if (*pa=*pb) *pc+=*pb+; else *pc+=*pa+;while (pa=pa_last) *pc+=*pa+;/将La的剩余部分接到Lcwhile (pb=pb_last) *pc+=*pb+;/将Lb的剩余部分接到Lc/MergeListvoid DeleteSame(List *L) /删除表中相同的元素 int j=0; for(i=1;=Llength-1; if(Lelemi!=Lelemj) Lelem+j=Lelemi;/前后不等时i,j均往后
6、移。 Llength=+j;3.主函数和其他函数的伪码算法void main() Initialization();/初始化 do input (List L);/输入一个线性表L Operate(List L);/对表进行操作 while (未执行DeleteSame)/mainvoid Initialization() clrscr();/清屏 屏幕出现提示信息; now input the list of A:/ Initializationvoid Input(List L)/输入线性表L doL=getch(); while(L!=-32768);/Inputvoid Operate
7、(List L)/对刚输入的表L进行操作 doCheckList(La); InputList(La); while(La不是非递增有序的);printlist(La);while(Lb不是非递增有序的);printlist(Lb); MergeList(La,Lb,Lc);DeleteSame(Lc);printlist(Lc);4 函数调用关系mainInitialization OperateList Input DeleteSame printlist MergeList CheckList InputList四、调试分析 由于对指针部分的C语言成分有所淡忘,导致一些变量的,*使用混乱
8、,使调试费时不少。比如MergeList函数中有if(*pa=*pb),一开始写成了if(pa=pb),结束程序运行结果不正确。输入时,元素间隔应为空格。一开始调试用的是,使程序无法运行。因此应注意输入的格式。3.本程序模块划分合格,使各部分基本独立,因而具有较高的可重用性。4. 算法的时空分析 各操作的算法时间复杂度比较合理 其中init为O(1),InputList,CheckList,MergeList,DeleteSame,printlist为O(n)。5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构:元素结点、线性顺序表、主控模块,使得设计时思路清晰,使调试也较顺利,各模
9、块有较好的可重用性,受到了一次良好的程序设计训练。五、用户手册 本程序的运行环境为windows 98操作系统,执行文件为Exp1Wsh2.c; 进入演示程序后,完成编译,连接(即同时按下Ctrl F9)进入演示界面:根据提示信息,用户输入数据(整型),以-32768为输入结束的标志。4.输入完毕(两张表)后,用户只需键入回车键,就能观看操作结果了。六、测试结果(1)同时键入Ctrl F9,进入用户界面,屏幕上出现: Now input the list of A:(2)输入:1_2_3_-32768,键入回车键,屏幕上出现: Your input is wrong.Please try ag
10、ain:(3)输入:9_5_0_-2_-32768,回车,出现: 9 5 0 -2 回车,出现: Now input the List of B: (4)输入:10_5_0_-1_-3_-5_-10,回车,出现: 10 5 0 -1 -3 -5 -10(5) 回车,出现: Now merge the List A and B: 10 9 5 5 0 0 -1 -2 -3 -5 -10(6) 回车,出现: Now delete the same elements in List C: 10 9 5 0 -1 -2 -3 -5 -10(7) 回车,退出用户界面,返回编辑状态。七、附录:源程序/-头
11、文件#includemalloc.hconio.h/符号常量#define ERROR O#define OK 1#define OVERFLOW -1#define LIST_INIT_SIZE 100/线性表存储空间的初始分配量#define LISTINCREMENT 10/线性表存储空间的分配增量/类型声明typedef struct LIST int length; int listsize; List;int init(List *L);/初始化,创建一张空表void InputList(List *L);/人工输入一张表Lvoid CheckList(List *L);/检验表L
12、是否是非递增有序的void MergeList(List *La,List *Lb,List *Lc);/合并La,Lb,用Lc存储void DeleteSame(List *L);/删除L中值相同的元素void printlist(List *L);/打印表Lmain()List La,Lb,Lc;/定义结构体变量,即表La,Lb,Lcinit(&La); init(&Lb);Lc);printf(Now please input the List of A:n );InputList(&CheckList(& printf(nprintlist(&getch();Now please in
13、put the List of B:Now Merge the List of A and B:MergeList(&La,&Lb,&n nNow delete the same elements in List C:nn DeleteSame(&/构造一个空的线性表L-elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType);if(!elem) exit(OVERFLOW);/ 存储分配失败length=0;/空表长度为0listsize=LIST_INIT_SIZE;/初始存储容量return OK; int n,j=0;/输入结束标志
14、%d L-elemj+=n;length=j; scanf( int i; for(i=0;length-1; if (L-elemielem;pb=Lb-Lc-length=La-length+Lb-length;listsize= La-elem=(ElemType *)malloc(Lc-listsize*sizeof(ElemType);pc=Lc-pa_last=La-elem+La-/La最后一个元素的地址pb_last=Lb-elem+Lb- /Lb最后一个元素的地址while(pa/表La,Lb都还未操作完时 if (*pa if(L-elemi!elemj) L-elem+j=L-elemi; L-length=+j;void printlist(List *L)/输入表L%dt,L-elemi);THANKS !致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1