数据结构线性表的顺序表示和实现的实习报告.docx
《数据结构线性表的顺序表示和实现的实习报告.docx》由会员分享,可在线阅读,更多相关《数据结构线性表的顺序表示和实现的实习报告.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构线性表的顺序表示和实现的实习报告
数学与计算科学学院
实验报告
实验项目名称线性表的顺序表示与实现所属课程名称数据结构
实验类型验证型
实验日期
班级
学号
姓名
成绩
实验概述:
【实验目的】
1线性表的逻辑结构特征
1.1以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。
1.2有且仅有一个开始结点,没有直接前驱,且仅有一个直接后继;有且仅有一个终结结点,没有直接后继,且仅有一个直接前驱。
1.3其余内部结点都有且仅有一个直接前驱和一个直接后继。
2掌握线性表的基本操作在顺序存储结构上的实现。
【实验原理】
1顺序表的特点
1.1逻辑位置上相邻和物理位置上相邻
1.2是一种随机存储结构,其存储位置可以用一简单直观的公式表示
2顺序表的类C语言表示:
#defineLIST_INIT_SIZE9II线性表存储空间的初始分配量
#defineLISTINCREMENT?
II线性表存储空间的分配增量
typedefstruct{
ElemType*elem;//存储空间基址
intlength;II当前长度
intlistsize;II当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
【实验环境】
VC++6.0
、【实验内容】
【实验方案】
编写主函数,调用顺序表的初始化建空表,插入和删除算法,调试运行得出结果
【实验过程】(实验步骤、记录、数据、分析)
8.先将线性表的动态分配顺序存储结构,算法与主函数编入VC++6.0中
typedefstruct
{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList_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;
}
StatusListInsert_Sq(SqList&L,inti,ElemTypee)
{
if(i<1||i>L.length+1)returnERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(!
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;returnOK;
}
StatusListDelect_Sq(SqList&L,inti,ElemType&e){
if((i<1)||(i>L.length))returnERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;returnOK;
}
voidmain()
{
SqListL;
inti;
InitList_Sq(L);for(i=0;i{
scanf("%d",&L.elem[i]);L.length++;
}for(i=0;iprintf("\n");
ElemTypee;
scanf("%d%d",&i,&e);
ListInsert_Sq(L,i,e);
for(i=0;iprintf("\n");
scanf("%d",&i);
ListDelect_Sq(L,i,e);
for(i=0;iprintf("\n");
}
2.调试第一次出现的错误:
cpp(y)
■
-
error
cpp<^)
■
-
error
cpp(3)
■
error
cpp(6)
-
启rror
■cpp(e)
■
■■
error
cpp(8)
■■
■a
Fatal
C214:
<:
syntaxerror:
missingbefcre***
:
Eienriipe^:
nlssirtgstorage-classorspecifiers
CZFhl:
'elpn11:
mi^ini|?
>Lordt|i?
-tla^^urLypt?
spt?
tiFiers
C2146:
5i|ritaxerror:
missing';'beforeidentifier'InitList_SqC2591:
1Status*:
missingstorage-classortype^pocifier£
errorC130*ure»p&ctedpndoFFil®found
原因:
由于许多变量未定义,以及没有头文件与宏定义所以错误许多,还有更多错误没有显示出来
3.将以下语句编入程序中:
#include"stdio.h"
#inelude"stdlib.h"
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE9
#defineLISTINCREMENT2typedefintElemType;
typedefintStatus;
4.调试第二次出现以下错误:
.cpp(9£):
errorC2965;*ncMbase":
Ufidrcl^rrdidentifier
■eppe蓟:
trror02^0;:
Cdnimlcutivcrtfruin'ibl*ftv'inL
rpirirprprptc^^TrJc-^ryiprcrFunrttnn^^ryipr^«;r
.cpp(3S>:
error'-':
cannotconvertfram'int1ta1int**
petopointertyperequiresipinterprrtcast,Cstylecastorfunctioncast
:
umJecltireijiJentifii?
r
:
cannotconvert+rom"int备*to
orFunction-stylecjst
;uiideLldreLiJetitifier
:
cannnrcflruprt卡ram-inr*■tncastoi*Punction-ft^lcc^st
^esareinterpretcast*aC-stylecastorfunction-stylecastus_cpp(52):
errorC2018:
unknowncharacter*0xa1*us_cpp<52):
errorC2018:
unknowncharacter'Qxa!
*
FUS.cpp(52)
fus.cpp(S2)
FUS.cpp(52)
fU5.cpp(52)
Fvs«cpp(52)
丽scpp(53)
errorerrorerrorerrorerrorerror
C2018:
C2EMB:
C2018:
C201«:
unknownunknovjnunknovmunkinom
characterch^ract^rcharactercharacter
•Oxal1
■
'0xa1''Oxal1
C210O:
illegal
C2^40:
indirection・:
cannotconvertfrom*int*pto'int'
areinterpretcast,aC^stylecastorfunction^stylecastfvs.cppCSS):
errorC2100:
illegalindirectionFus.cpp(55):
errorC2100:
illegalindirectionFus.cpp(55):
error原因:
是在每个算法中有许多变量未定义,导致许多错误5.再将语句:
int*newbase;
int*q;
int*p;
写入插入算法中;
将语句:
int*p;
int*q;
写入删除算法中;
6.调试第三次显示没有错误:
Compiling…asFvs・(7pp
asfus.obj-&error(s),0warning(s)
7.运行第一次显示结果为:
"逹:
\作吕谧搞结昭理序\草精所埶回
1
23
45
67
89
*
1
2
3
4
56
7
1
19
678
2
3
4
6?
85
6
?
89
2
3
4
6786
?
B9
Press
any
kev
tocontinuea
■
rrr
IZI
8.但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句和条件语句;为了让程序更加严谨,因此还加入一些循环语句。
inti,p,q;
p=2,q=2;
printf(”请输入您想构建的顺序表(元素为%c个):
\n",LIST_INIT_SIZE);
printf(”您构建的顺序表是:
\n");
printf("请输入您想在第几个元素位置前插入元素:
\n",LIST_INIT_SIZE);
while((i<=O||i>L.length)&&p>=0)
{
printf("输入的数字错误,(只剩下%畝重新输入符合要求的数字的机会)\n",p);
--p;
if(p<0)
{
printf("原因:
您输入数字错误过多,程序终止运行\n”);
returnERROR;
}
scanf("%d",&i);
}
printf(”请输入您想插入的数:
\n");
printf(”形成的新顺序表为:
\n");
printf(”请输入您想删除的是第几个元素:
\n");
while((i<=0||i>L.length)&&q>=0)
{
printf("输入的数字错误,(只剩下%畝重新输入符合要求的数字的机会)\n",q);
--q;
if(q<0)
{
printf(”原因:
您输入数字错误过多,程序终止运行\n”);
returnERROR;
}printf("删除的数为:
\n");
printf("%d\n”,e);
printf(”形成的新顺序表为:
\n");
将语句seanf("%d%d",&i,&e);变为seanf("%d",&i);scanf("%d",&e);
9.那么主函数包含的语句变为:
main()
{
SqListL;
inti,p,q;
p=2,q=2;
InitList_Sq(L);
printf("请输入您想构建的顺序表(元素为%d个):
\n",LIST_INIT_SIZE);
for(i=0;i{
scanf("%d",&L.elem[i]);
L.length++;
}
printf("您构建的顺序表是:
\n");
for(i=0;iprintf("%d",L.elem[i]);
printf("\n”);
ElemTypee;
printf("请输入您想在第几个元素位置前插入元素:
\n");
scanf("%d",&i);
while((i<=O||i>L.length)&&p>=0)
{
\n",p);
printf("输入的数字错误,(只剩下%4次重新输入符合要求的数字的机会)
--p;
if(p<0)
{
printf("原因:
您输入数字错误过多,程序终止运行\n”);
returnERROR;
}
scanf("%d",&i);
}
printf("请输入您想插入的数:
\n");
scanf("%d",&e);
ListInsert_Sq(L,i,e);printf(”形成的新顺序表为:
\n");
for(i=0;iprintf("%d",L.elem[i]);
printf("\n");
printf("请输入您想删除的是第几个元素:
\n");
scanf("%d",&i);
while((i<=O||i>L.length)&&q>=0)
{
\n",q);
printf("输入的数字错误,(只剩下%4次重新输入符合要求的数字的机会)
--q;
if(q<0)
{
printf("原因:
您输入数字错误过多,程序终止运行\n”);
returnERROR;
}
scanf("%d",&i);
}
ListDelect_Sq(L,i,e);
printf("删除的数为:
\n");
printf("%d\n",e);printf(”形成的新顺序表为:
\n");
for(i=0;iprintf("%d",L.elem[i]);
printf("\n”);
return0;
}
10.调试第四次显示没错误:
uuntxyuiauxutt.i忖丄
Compiling
asfvs.cpp
asfus.obj-Qerror(s)r0warning(s)
11.运行第二次显示结果为:
12.运行第三次显示结果为:
13.运行第四次显示结果为:
请输入您想构建的顺序表(元素为9个)=
1234E67S9
您构建的顺序表杲:
■£22456789
请输入您想在第几个元素位置前插入元素二
18
输入的数字错误.(只乘U下瞅重新输入符合要求的数字的机会)常入的数字错误.(只剩Ft枕重新输入符合要求的数字的机会){青输入您想插入的数:
6183
形成的新顺序表为;
彳744C仇~(曲4£."5Qo
睛输入您想删除的是第几个元素:
13
输入的数字诸误.(只剩下2次重新输入符合要求的数字的机会)易入的数字错误,(只剩下丄次重新输入符合要求的数字的机会)电除的数为:
協咸的新顺序表为=
123456183?
89
Pressani^ytocomtinue
1刑
这样那么程序就完整了,清晰明了,用户运行的时候也容易知道自己要输入什么了
【实验结论】(结果)
i曲%谍性義的1驚表示与实现心bL口|屈*3^
幘输入您想构建的顺序表(元素为9个厂
1234348395348349934923523937
欣构建的顺序表是:
123434839534834993492352393?
请输入您想在第几个元素位置前荷入元素:
爲入的数字错误亠(只剩下煤董新输入符合要求的数字的机会)
隋输入您想插入的数,
84?
8
旳成的新顺序表为匕
12343483953483499349238478523937
辰输入您想删除的是第几个元素=
踣V的数字错误.〔只乘R次重新输入符合要求的数字的机会)初除的数为S
523
阿成的新顺序表为:
123434839534834?
9349238478937
Pressanykeytocontinme
【实验小结】(收获体会)
1.实验程序应该多些注释,这样方便人家读懂自己编写的程序。
2.主函数中多增加一些printf函数,方便运行时输入数据
3.编与程序是细心点,注意人小写,注意单词拼写,还要注意分号
4.努力看书,要看懂算法的功能,结合C语言知识能快速调试并且改正错误
5.要清楚算法不同于程序,算法就相当于C语言中的定义函数功能语句且是不完整的语句。
三、指导教师评语及成绩:
评语
评语等级
优
良
中
及
格
不及格
1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强
2.实验方案设计合理
3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)
4实验结论正确.
成绩:
指导教师签名:
批阅日期:
附录1源程序
#include"stdio.h"
#inelude"stdlib.h"
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE9//线性表存储空间的初始分配量
#defineLISTINCREMENT2//线性表存储空间的分配增量
typedefintElemType;〃自定义类型名
typedefintStatus;
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
StatusInitList_Sq(SqList&L)//构造一个空的线性表L
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);//存储分配失败
L.length=O;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量returnOK;
}
StatusListInsert_Sq(SqList&L,inti,ElemTypee)//在顺序线性表L的第i个元素之前插入新的元素e,i的合法值为1wi{
int*newbase;
int*q;
int*p;
if(i<1||i>L.length+1)returnERROR;//i值不合法
if(L.length>=L.listsize)//当前存储空间已满,增加容量
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(!
newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
q=&(L.elem[i-1]);//q为插入位置
for(p=&(L.elem[L」ength_1]);p>=q;__p)
*(p+1)=*p;//插入位置及之后的元素右移
*q=e;〃插入e
++L.length;//表长增1
returnOK;
}
StatusListDelect_Sq(SqList&L,inti,ElemType&e)//在顺序线性表L中删除第i个元素,并用e返回其值,i的合法值为1
{
int*p;
int*q;
if((i<1)||(i>L.length))returnERROR;//i值不合法
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;II被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减1
returnOK;
}
main()
{
SqListL;
inti,p,q;
p=2,q=2;
InitList_Sq(L);
printf("请输入您想构建的顺序表(元素为%d个):
\n",LIST_INIT_SIZE);
for(i=0;i{
scanf("%d",&L.elem[i]);
L.length++;
}
printf("您构建的顺序表是:
\n");
for(i=0;iprintf("%d",L.elem[i]);
printf("\n");
ElemTypee;
printf("请输入您想在第几个元素位置前插入元素:
\n",L.length);
seanf("%d",&i);
while((i<=O||i>L.length)&&p>=0)
{
printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)
--P;
if(P<0)
{
printf(”原因:
您输入数字错误过多,程序终止运行\n");
returnERROR;
}
scanf("%d",&i);
}
printf("请输入您想插入的数:
\n");
scanf("%d",&e);
ListInsert_Sq(L,i,e);printf("形成的新顺序表为:
\n");
for(i=0;iprintf("%d",L.elem[i]);
printf("\n