您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 线性表的顺序存储结构-实验报告样例
1年南昌航空大学实验报告(用实验报告纸,手写)课程名称:数据结构实验名称:实验一线性表的顺序存储结构班级:080611学生姓名:赖凌学号:08061101指导教师评定:签名:题目:有两张非递减有序的线性学生表A,B,采用顺序存储结构,两张表合并用c表存,要求C仍为非递减有序的,并删除C中值相同的表。一、需求分析⒈本演示程序根据已有的6位学生的信息,实现两张表的合并及删除值相同元素的操作,不需要用户重新输入学生的信息。⒉在演示过程序中,用户敲击键盘,即可观看演示结果。⒊程序执行的命令包括:(1)构造线性表A(2)构造线性表B(3)求两张表的并(4)删除C中值相同的元素二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADTStack{数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0}数据关系:R1={ai-1,ai|ai-1,ai∈D,i=2,…n≥0}基本操作:init(list*L)操作结果:构造一个空的线性表L。ListLength(List*L)初始条件:线性表L已经存在操作结果:返回L中数据元素的个数。GetElem(ListL,inti,ElemType*e)初始条件:线性表L已经存在,1≤i≤ListLength(&L)操作结果:用e返回L中第i个数据元素的值。EqualList(ElemType*e1,ElemType*e2)初始条件:数据元素e1,e2存在操作结果:以e1,e2中的姓名项作为判定e1,e2是否相等的依据。Less_EquaList(ElemType*e1,ElemType*e2)初始条件:数据元素e1,e2存在操作结果:以e1,e2中的姓名项(为字符串)的≤来判定e1,e2是否有≤的关系。LocateElem(List*La,ElemTypee,inttype)初始条件:线性表La已经存在操作结果:判断La中是否有与e相同的元素。2MergeList(List*La,List*Lb,List*Lc)初始条件:非递减线性表La,Lb已经存在操作结果:合并La,Lb得到Lc,Lc仍按非递减有序排列。UnionList(List*La,List*Lb)初始条件:线性表La,Lb已经存在操作结果:将所有在Lb而不在La中的元素插入到La中表尾的位置。PrintList(ListL)初始条件:线性表L已经存在操作结果:打印出表L。ListInsert(List*L,inti,structSTUe)初始条件:线性表L已经存在,1≤i≤ListLength(&L)+1操作结果:在表L中第i个位置前插入元素e,L的长度加1。}ADTList2.本程序有三个模块:⑴主程序模块voidmain(){初始化;{接受命令;显示结果;}}⑵线性表单元模块:实现线性表抽象数据类型;⑶结点结构单元模块:定义线性表中的结点结构。三、详细设计⒈元素类型,结点类型structSTU{charname[20];//学生名字、学号、年龄、分数charstuno[10];intage;intscore;};typedefstructSTUElemType;//元素类型structLIST{ElemType*elem;intlength;//表的长度、大小intlistsize;};typedefstructLISTlist;//结点类型32.对抽象数据类型中的部分基本操作的伪码算法如下:intinit(List*L){L→elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);If(!L→elem)exit(OVERFLOW);L→length=0;L→listsize=LIST_INIT_SIZE;ReturnOK;}//初始化表intListLength(List*L){returnL→length;}//返回表长voidGetElem(ListL,inti,ElemType*e){*e=L.elem[i];}//返回元素intlocateElem(List*La,ElemTypee,inttype){intI;switch(type)//确定元素在表中的位置{caseEQVAL;for(i=0;iLa→length;i++)if(EqualList(&La→elem[i],&e))return1;break;default;break;}return0;}voidMergeList(List*La,List*Lb,List*Lc){//将两个表合并成LcElemType*pa,*pb,*pc,*pa_last,*pb_last;Pa=La→elem;pb=Lb→elem;Lc→Listsize=Lc→length=La→length+Lb→length;Pc=Lc→elem==(ElemType*)malloc(Lc→listsize*sizeof(ElemType));if(!Lc→elem)exit(OVERFLOW);pa_last=La→elem+La→length-1;pb_last=Lb→elem+Lb→length-1;4while(pa=pa_last&&pb=pb_last){if(Less_EqualList(pa,pb))*pc++=*pa++;else*pc++=*pb++;}while(pa=pa_last)*pc++=*pa++;while(pb=pb_last)*pc++=*pb++;}voidUnionList(List*La,List*Lb){La_len=ListLength(La);Lb_len=ListLength(Lb);For(i=0;iLb_len;i++){GetElem(*Lb,i,&e);If(!LocateElem(La,e,EQUAL))ListInsert(La,++La_len,e);}}intListInset(List*L,inti,structSTUe){//将元素插入表L中if(i1||iL→length+1)returnERROR;q=&(L→elem[i-1]);for(p=L→elem[L→length-1];p=q;p--)*(p+1)=*p;*q=e;++(L→length);returnOK;}//ListInsertBeforei3.主函数和其他函数的伪码算法voidmain(){Initialization();//初始化ReadCommand(cmd);//读入一个操作符MakeList(La);printList(La);//产生并打印LaMakeList(Lb);printList(Lb);//产生并打印LbOperateList(La,Lb);}5voidInitialization(){//系统初始化clrscr();}intReadCommand(cmd)//任意键入一个字符{cmd=getch();return1;}voidMakeList(La){ListInsert(&La,i,e);}voidOperateList(La,Lb){MergeList(&La,&Lb,&Lc);UnionList(&La,&Lb);}4函数调用关系mainInitializationMakeListOperateListReadCommandprintListUnionListMergeListLess_EqualListInitListInsertLocateElemEqualList四、调试分析⒈刚开始输入时,漏掉了一些变量参数的标记&,有的则错加了&,使得程序运行出来的结果不正确,使调试程序时费时不少。⒉程序采用逐个输入的方法创建La,Lb,在元素较多时,会使得程序很庞大,不利于检查错误等。⒊算法的时空分析各操作的算法时间复杂度比较合理6init,ListLength,GetElem,EqualList,Less_EqualList为O(1)LocateElem,ListInsert,printList为O(n),UnionList为O(mn),MergeList为O(n)。4.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好的可重用性。五、用户手册⒈本程序的运行环境为windowsxp操作系统,执行文件为Exp1Prb1.c;⒉进入演示程序后,完成编译,连接(即同时按下CtrlF9)进入演示界面,用户键入任一符号,都能看完整个演示过程。六、测试结果(1)同时键入CtrlF9,演示为:-----------------ListDemoisrunning--------------FirstisInsertListfunctionnamestunoagescorestu1100001801000stu3100002801000(2)键入任意字符,演示为:namestunoagescorestu1100001801000stu3100002801000stu5100003801000ListAlengthnowis3.(3)键入任意字符,演示为:namestunoagescorestu2100001801000stu4100002801000stu6100001801000ListBlengthnowis3.(4)键入任意字符,演示为:namestunoagescorestu1100001801000stu2100001801000stu3100002801000stu4100002801000stu5100003801000stu6100001801000SecondisUnionListfunction.NowunionListAandListB...namestunoagescore7stu1100001801000stu2100002801000stu3100003801000stu4100001801000stu5100002801000stu6100001801000ListAlengthnowis6.(5)键入任意字符,退出演示界面,回到编辑状态。七、附录:题一源程序//------头文件#includestdio.h#includemalloc.h#includeconio.h//符号常量#defineERRORO#defineOK1#defineEQUAL1#defineOVERFLOW-1#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量#defineLISTINCREMENT10//线性表存储空间的分配增量//类型声明structSTU{//定义学生结构体类型,包括姓名,学号,年龄,成绩charname[20];charstuno[10];intage;intscore;}stu[50];typedefstructSTUElemType;//用ElemType代替学生structLIST{//定义表LIST为结构体类型ElemType*elem;//存储空间基址intlength;//当前长度intlistsize;//当前分配的存储容量};typedefstructLISTList;//用list代表结构体LISTintinit(List*L){//构造一个空的线性表L→elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));8If(!L→elem)exit(OVERFLOW);//存储分配失败L→length=0;//空表长度为0L→listsize=LIST_INIT_SIZE;//初始存储容量Returnok;}intListLength(List*L){//求表L的长度returnL→length;}voidGetElem(ListL,inti,ElemType*e){*e=L.elem[i];}intEqualList(ElemType*e1,Ele
本文标题:线性表的顺序存储结构-实验报告样例
链接地址:https://www.777doc.com/doc-5787452 .html