数据结构线性表的顺序表示和实现的实习报告.docx

上传人:b****7 文档编号:25597098 上传时间:2023-06-10 格式:DOCX 页数:23 大小:305.62KB
下载 相关 举报
数据结构线性表的顺序表示和实现的实习报告.docx_第1页
第1页 / 共23页
数据结构线性表的顺序表示和实现的实习报告.docx_第2页
第2页 / 共23页
数据结构线性表的顺序表示和实现的实习报告.docx_第3页
第3页 / 共23页
数据结构线性表的顺序表示和实现的实习报告.docx_第4页
第4页 / 共23页
数据结构线性表的顺序表示和实现的实习报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据结构线性表的顺序表示和实现的实习报告.docx

《数据结构线性表的顺序表示和实现的实习报告.docx》由会员分享,可在线阅读,更多相关《数据结构线性表的顺序表示和实现的实习报告.docx(23页珍藏版)》请在冰豆网上搜索。

数据结构线性表的顺序表示和实现的实习报告.docx

数据结构线性表的顺序表示和实现的实习报告

数学与计算科学学院

实验报告

实验项目名称线性表的顺序表示与实现所属课程名称数据结构

实验类型验证型

实验日期

班级

学号

姓名

成绩

实验概述:

【实验目的】

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1