数据结构实验一 线性表的顺序存储结构和链式存储结构.docx
《数据结构实验一 线性表的顺序存储结构和链式存储结构.docx》由会员分享,可在线阅读,更多相关《数据结构实验一 线性表的顺序存储结构和链式存储结构.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实验一线性表的顺序存储结构和链式存储结构
中山大学新华学院实验报告
课程名称:
数据结构实验名称:
实验一线性表的顺序存储结构和链式存储结构
班级:
09级计算机学生姓名:
郑永坤学号:
********
指导教师评定:
签名:
题目:
利用线性表的顺序存储结构和链式存储结构分别存储数据并把数据输出。
一、需求分析
⒈本演示程序分别用顺序存储结构和链式存储结构存储数据并把数据输出。
⒉在演示过程序中,用户敲击键盘,输入数据存储,即可看到数据的输出。
⒊程序执行的命令包括:
(1)定义结构体
(2)建立空表(3)构造输入数据的函数(4)构造输出数据的函数
二、概要设计
⒈为实现上述算法,需要线性表的抽象数据类型:
顺序存储结构的抽象数据类型:
ADTSqList{
数据对象:
D={ai:
|ai∈ElemSet,i=1…n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…n≥0}
基本操作:
InitList_Sq(SqList*L)
操作结果:
构造一个空的线性表L。
inputlist(SqList*L)
初始条件:
线性表L已经存在
操作结果:
存储输入的数据元素。
outputlist(SqList*L)
初始条件:
线性表L已经存在
操作结果:
输出表L。
}ADTSqList
链式存储结构的抽象数据类型:
ADTlinklist{
数据对象:
D={ai:
|ai∈ElemSet,i=1…n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…n≥0}
基本操作:
linklist*creatL(linklist*L)
初始条件:
线性表L已经存在
操作结果:
存储输入的数据元素。
output(linklist*L)
初始条件:
线性表L已经存在
操作结果:
输出表L。
}ADTlinklist
2.本程序有三个模块:
⑴主程序模块
voidmain(){
初始化;
{
接受命令;
显示结果;
}
}
⑵线性表单元模块:
实现线性表抽象数据类型;
⑶结点结构单元模块:
定义线性表中的结点结构。
三、详细设计
⒈结点类型
顺序存储结构的结点类型:
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以size(ElemType)为单位)
}SqList;
链式存储结构的结点类型:
typedefstructLnode
{
intscore;
structLnode*next;
}linklist;//定义一个节点
2.对抽象数据类型中的部分基本操作的伪码算法如下:
顺序存储结构:
intInitList_Sq(SqList*L){//建立一个空的线性表
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L->elem)exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
returnOK;
}
intinputlist(SqList*L)//输入线性表内容
{
inti,*p;
p=L->elem;
printf("请输入要存储元素的个数:
");
scanf("%d",&L->length);
printf("\n");
printf("请输入存储元素值:
");
for(i=0;ilength;i++)
scanf("%d",(p+i));
return1;
}
intoutputlist(SqList*L)//输出线性表内容
{
inti,*p;
p=L->elem;
for(i=0;ilength;i++)
printf("%-5d",L->elem[i]);
return1;
}
链式存储结构:
linklist*creatL(linklist*L)
{//建立一个单链表
linklist*p,*q;
intelem,flag=1;
L=(linklist*)malloc(sizeof(Lnode));
if(!
L)
{
printf("分配空间失败");
returnERROR;//分配空间失败
}
L->next=NULL;
p=L;
while(flag)
{
printf("请输入元素(输入0结束输入):
");
scanf("%d",&elem);
if(elem!
=0)
{
q=(linklist*)malloc(sizeof(Lnode));
if(!
q)returnERROR;//分配空间失败
q->score=elem;
p->next=q;
p=q;
p->next=NULL;
}
else
flag=0;
}
return(L);
}
voidoutput(linklist*L)
{//按顺序输出元素
linklist*p;
p=L->next;
printf("链表元素依次为\n");
while(p)
{
printf("%-5d",p->score);
p=p->next;
}
printf("\n");
}
3.主函数和其他函数的伪码算法
顺序存储机构:
intmain()
{
SqListLa;
InitList_Sq(&La);//创建一个新表La
inputlist(&La);//输入数据元素
outputlist(&La);//输出数据元素
return0;
}
链式存储结构:
voidmain()
{
linklist*L=NULL;
L=creatL(L);
output(L);//按顺序输出元素
}
4函数调用关系
顺序存储结构:
链式存储结构:
四、调试分析
⒈刚开始输入时,漏掉了一些变量参数的标记"&",有的则错加了"&",使得程序运行出来的结果不正确,使调试程序时费时不少。
⒉一开始不知道怎么构造输出数据的函数,后来想到了结构数组,顺利写出输出函数。
⒊算法的时空分析
各操作的算法时间复杂度比较合理
InitList_Sq为O
(1)
Inputlist,outputlist,creatL,output为O(n)。
4.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好的可重用性。
五、用户手册
⒈本程序的运行环境为windowsxp操作系统,执行文件为顺序存储.c和链式存储.c;
⒉进入演示程序后,完成编译,连接(即按下CtrlF5)进入演示界面,用户键入线性表的数据元素。
六、测试结果
顺序存储:
(1)键入CtrlF5,演示为:
(2)键入元素个数,演示为:
(3)键入任意数据,演示为:
(5)按回车,退出演示界面,回到编辑状态。
链式存储:
(1)键入CtrlF5,演示为:
(2)键入任意数据,演示为:
(5)按回车,退出演示界面,回到编辑状态。
七、附录:
题一源程序
顺序结构存储源程序:
#include
#include
#include
#include
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配增量
#defineLISTINCREMENT100//线性表存储空间的分配增量
#defineOK1
#defineOVERFLOW-1
#defineElemTypeint
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以size(ElemType)为单位)
}SqList;
intInitList_Sq(SqList*L){
//构造一个空的线性表L。
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L->elem)exit(OVERFLOW);//存储分配失败
L->length=0;//空间长度为0
L->listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}
intinputlist(SqList*L)//输入线性表内容
{
inti,*p;
p=L->elem;
printf("请输入要存储元素的个数:
");
scanf("%d",&L->length);
printf("\n");
printf("请输入存储元素值:
");
for(i=0;ilength;i++)
scanf("%d",(p+i));
return1;
}
intoutputlist(SqList*L)//输入线性表内容
{
inti,*p;
p=L->elem;
for(i=0;ilength;i++)
printf("%-5d",L->elem[i]);
return1;
}
intmain()
{
SqListLa;
InitList_Sq(&La);//创建一个新表La
inputlist(&La);//输入线性表元素
outputlist(&La);//输出线性表
return0;
}
链式结构存储源程序:
#include
#include
#defineOK1
#defineERROR0
typedefstructLnode
{
intscore;
structLnode*next;
}linklist;//定义一个节点
linklist*creatL(linklist*L)
{//建立一个单链表
linklist*p,*q;
intelem,flag=1;
L=(linklist*)malloc(sizeof(Lnode));
if(!
L)
{
printf("分配空间失败");
returnERROR;//分配空间失败
}
L->next=NULL;
p=L;
while(flag)
{
printf("请输入元素(输入0结束输入):
");
scanf("%d",&elem);
if(elem!
=0)
{
q=(linklist*)malloc(sizeof(Lnode));
if(!
q)returnERROR;//分配空间失败
q->score=elem;
p->next=q;
p=q;
p->next=NULL;
}
else
flag=0;
}
return(L);
}
voidoutput(linklist*L)
{//按顺序输出元素
linklist*p;