线性表的顺序存储结构实验报告Word文档格式.docx
《线性表的顺序存储结构实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《线性表的顺序存储结构实验报告Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![线性表的顺序存储结构实验报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/30/3141dae6-b78e-4a7d-923f-a67ad5690402/3141dae6-b78e-4a7d-923f-a67ad56904021.gif)
操作结果:
构造一个空的线性表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(ListL)
打印出表L。
}ADTList
2.本程序有三个模块:
⑴主程序模块
voidmain(){
初始化;
do{
接受命令;
显示结果;
}while(执行完毕)
}
⑵线性表单元模块:
实现线性表抽象数据类型;
⑶结点结构单元模块:
定义线性表中的结点结构。
三、详细设计
⒈元素类型,结点类型
typedefintElemType;
//元素类型
structLIST{
ElemType*elem;
intlength;
intlistsize;
};
typedefstructLISTlist;
//结点类型
2.对抽象数据类型中的部分基本操作的伪码算法如下:
intinit(List*L)
{//初始化表L
L→elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
//为线性表顺序结构分配空间
If(!
L→elem)exit(ERROR);
L→length=0;
L→listsize=LIST_INIT_SIZE;
ReturnOK;
}//initList
voidInputList(List*L)
{//构造表L
intflag=-32768;
//输入结束的标志
scanf("
%d"
&
n);
//输入元素
while(n!
=flag)
{//继续输入
L→elem[j++]=n;
L→length=j;
Scanf("
}
}//InputList
voidCheckList(List*L)
{
for(i=0;
i<
L→length-1;
i++)
{
if(L→elem[i]<
L→elem[i+1])
InputList(L);
//输入为递增时,要重新输入
i=0;
}//CheckList
voidMergeList(List*La,List*Lb,List*Lc)
{//表La和Lb合并为Lc
Pa=La→elem;
pb=Lb→elem;
//pa,pb分别指向La,Lb的第一个元素
Lc→Listsize=La→length+Lb→length;
Lc→elem==(ElemType*)malloc(Lc→listsize*sizeof(ElemType));
pc=Lc→elem;
//pc指向表Lc的第一个元素
pa_last=La→elem+La→length-1;
//表La最后一个元素的地址
pb_last=Lb→elem+Lb→length-1;
//表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的剩余部分接到Lc
while(pb<
=pb_last)*pc++=*pb++;
//将Lb的剩余部分接到Lc
}//MergeList
voidDeleteSame(List*L)
{//删除表中相同的元素
intj=0;
for(i=1;
=L→length-1;
if(L→elem[i]!
=L→elem[j])L→elem[++j]=L→elem[i];
//前后不等时i,j均往后移。
L→length=++j;
3.主函数和其他函数的伪码算法
voidmain()
{
Initialization();
//初始化
do{
input(ListL);
//输入一个线性表L
Operate(ListL);
//对表进行操作
}while(未执行DeleteSame)
}//main
voidInitialization()
clrscr();
//清屏
屏幕出现提示信息;
nowinputthelistofA:
}//Initialization
voidInput(ListL)
{//输入线性表L
do{L=getch();
while(L!
=-32768);
}//Input
voidOperate(ListL)
{//对刚输入的表L进行操作
do{CheckList(La);
InputList(La);
while(La不是非递增有序的);
printlist(La);
while(Lb不是非递增有序的);
printlist(Lb);
MergeList(La,Lb,Lc);
DeleteSame(Lc);
printlist(Lc);
4函数调用关系
main
InitializationOperateListInput
DeleteSameprintlistMergeListCheckListInputList
四、调试分析
⒈由于对指针部分的C语言成分有所淡忘,导致一些变量的"
"
,"
*"
使用混乱,使调试费时不少。
比如MergeList函数中有if(*pa<
=*pb),一开始写成了if(pa<
=pb),结束程序运行结果不正确。
⒉输入时,元素间隔应为空格。
一开始调试用的是"
,使程序无法运行。
因此应注意输入的格式。
3.本程序模块划分合格,使各部分基本独立,因而具有较高的可重用性。
4.算法的时空分析
各操作的算法时间复杂度比较合理
其中init为O
(1),InputList,CheckList,MergeList,DeleteSame,printlist为O(n)。
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构:
元素结点、线性顺序表、主控模块,使得设计时思路清晰,使调试也较顺利,各模块有较好的可重用性,受到了一次良好的程序设计训练。
五、用户手册
⒈本程序的运行环境为windows98操作系统,执行文件为Exp1Wsh2.c;
⒉进入演示程序后,完成编译,连接(即同时按下CtrlF9)进入演示界面:
根据提示信息,用户输入数据(整型),以-32768为输入结束的标志。
4.输入完毕(两张表)后,用户只需键入回车键,就能观看操作结果了。
六、测试结果
(1)同时键入CtrlF9,进入用户界面,屏幕上出现:
NowinputthelistofA:
(2)输入:
1__2__3__-32768,键入回车键,屏幕上出现:
Yourinputiswrong.Pleasetryagain:
(3)输入:
9__5__0__-2__-32768,回车,出现:
950-2
回车,出现:
NowinputtheListofB:
(4)输入:
10__5__0__-1__-3__-5__-10,回车,出现:
1050-1-3-5-10
(5)回车,出现:
NowmergetheListAandB:
1095500-1-2-3-5-10
(6)回车,出现:
NowdeletethesameelementsinListC:
10950-1-2-3-5-10
(7)回车,退出用户界面,返回编辑状态。
七、附录:
源程序
//------头文件
#include<
stdio.h>
malloc.h>
conio.h>
//符号常量
#defineERRORO
#defineOK1
#defineOVERFLOW-1
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
//类型声明
typedefstructLIST{
intlength;
intlistsize;
}List;
intinit(List*L);
//初始化,创建一张空表
voidInputList(List*L);
//人工输入一张表L
voidCheckList(List*L);
//检验表L是否是非递增有序的
voidMergeList(List*La,List*Lb,List*Lc);
//合并La,Lb,用Lc存储
voidDeleteSame(List*L);
//删除L中值相同的元素
voidprintlist(List*L);
//打印表L
main()
ListLa,Lb,Lc;
//定义结构体变量,即表La,Lb,Lc
init(&
La);
init(&
Lb);
Lc);
printf("
NowpleaseinputtheListofA:
\n"
);
InputList(&
CheckList(&
printf("
\n"
printlist(&
getch();
NowpleaseinputtheListofB:
NowMergetheListofAandB:
MergeList(&
La,&
Lb,&
\n\n"
NowdeletethesameelementsinListC:
\n\n"
DeleteSame(&
{//构造一个空的线性表
L->
elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
elem)exit(OVERFLOW);
//存储分配失败
length=0;
//空表长度为0
listsize=LIST_INIT_SIZE;
//初始存储容量
returnOK;
intn,j=0;
//输入结束标志
%d"
L->
elem[j++]=n;
length=j;
scanf("
inti;
for(i=0;
length-1;
if(L->
elem[i]<
elem[i+1])
{printf("
Yourinputiswrong.Pleasetryagain:
InputList(L);
//重新输入表L
}
voidMergeList(List*La,List*Lb,List*Lc)
ElemType*pa,*pb,*pc,*pa_last,*pb_last;
pa=La->
elem;
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<
//将较大者插入Lc中,从而Lc为非递增有序
else*pc++=*pa++;
//插入La的剩余元素
//插入Lb的剩余元素
inti,j=0;
for(i=1;
=L->
if(L->
elem[i]!
elem[j])
L->
elem[++j]=L->
elem[i];
L->
length=++j;
voidprintlist(List*L)
{//输入表L
%d\t"
L->
elem[i]);
THANKS!
!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考