数据结构线性表的顺序表示和实现的实习报告.docx
- 文档编号:25597098
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:23
- 大小:305.62KB
数据结构线性表的顺序表示和实现的实习报告.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;i printf("\n"); ElemTypee; scanf("%d%d",&i,&e); ListInsert_Sq(L,i,e); for(i=0;i printf("\n"); scanf("%d",&i); ListDelect_Sq(L,i,e); for(i=0;i printf("\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;i printf("%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;i printf("%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;i printf("%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;i printf("%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;i printf("%d",L.elem[i]); printf("\n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 顺序 表示 实现 实习 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)