实验一 线性表操作 实验报告.docx

上传人:b****8 文档编号:9015860 上传时间:2023-02-02 格式:DOCX 页数:15 大小:86.80KB
下载 相关 举报
实验一 线性表操作 实验报告.docx_第1页
第1页 / 共15页
实验一 线性表操作 实验报告.docx_第2页
第2页 / 共15页
实验一 线性表操作 实验报告.docx_第3页
第3页 / 共15页
实验一 线性表操作 实验报告.docx_第4页
第4页 / 共15页
实验一 线性表操作 实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验一 线性表操作 实验报告.docx

《实验一 线性表操作 实验报告.docx》由会员分享,可在线阅读,更多相关《实验一 线性表操作 实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

实验一 线性表操作 实验报告.docx

实验一线性表操作实验报告

中国矿业大学计算机学院实验报告

课程名称  数据结构  实验名称__线性表操作   

实验报告要求:

1.实验目的  2.实验内容  3.实验步骤   

4.运行结果  5.流程图     6.实验体会   

 一、实验目的

1熟悉并掌握线性表的逻辑结构、物理结构。

精品文档,你值得期待

2熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。

3熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。

4熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。

二、实验要求

1实验之前认真准备,编写好源程序。

2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。

3不断积累程序的调试方法。

三、实验内容

基本题:

1对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。

源程序:

 #include

#include

#include

constLIST_INIT_SIZE=10;

constLISTINCREMENT=1;

typedefstruct

{

int*elem;

intlength;

intlistsize;

}SqList;

voidInitList_Sq(SqList&L)//构造一个空的线性表L

{

L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));

if(!

L.elem)

exit(0);//存储分配失败

L.length=0;//空表长度为0

L.listsize=LIST_INIT_SIZE;//初始存储容量

cout<<"OK!

"<

}

voidListInsert_Sq(SqList&L,inti,intj)//在顺序线性表L中第i个位置之前插入新的元素j,

//i的合法值为1<=i<=ListInsert_Sq(L)+1

{

if(i<1||i>L.length+1)

cout<<"ERROR!

"<

if(L.length>=L.listsize)//当前存储空间已满,增加分配

{

int*newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));

if(!

newbase)

exit(0);//存储分配失败

L.elem=newbase;//新基址

L.listsize+=LISTINCREMENT;//增加存储容量

}

int*q=&(L.elem[i-1]);

for(int*p=&(L.elem[L.length-1]);p>=q;--p)

*(p+1)=*p;

*q=j;

++L.length;

cout<<"OK!

"<

}//ListInsert_Sq

voidListDelete_Sq(SqList&L,inti,int&j)//在顺序线性表L中删除第i个元素,并用j返回其值

//i的合法值为1<=i<=ListInsert_Sq(L)

{

if((i<1)||(i>L.length))

cout<<"ERROR!

"<

int*p=&(L.elem[i-1]);//p为被删除元素的位置

j=*p;//被删除元素的值赋给j

int*q=L.elem+L.length-1;//表尾元素的位置

for(++p;p<=q;++p)

*(p-1)=*p;

--L.listsize;//被删除元素之后的元素左移

cout<<"OK!

"<

}//ListDelete_Sq

boolcompare(intm,intn)

{

if(m==n)

returntrue;

else

returnfalse;

}

intLocateElem_Sq(SqListL,intj)//在顺序线性表L中查找第1个值与j满足compare()的元素的位序

//若找到,则返回其在L中的位序,否则返回0

{

inti=1;//i的初值为第1个元素的位序

int*p=L.elem;//p的初值为第1个元素的存储位置

while(i<=L.length&&!

compare(*p,j))

{

++i;

p++;

}

if(i<=L.length)

returni;

else

return0;

}//LocateElem_Sq

voiddisp(SqList&L)

{

int*p=L.elem;

for(inti=0;i

{

cout<<*p<<"";

p++;

}

}

voidmain()

{

SqListList;

InitList_Sq(List);

int*p=List.elem;

intm,n,j,k,x,y;

for(inti=0;i

{

cin>>x;

*p=x;

p++;

List.length++;

}

cout<<"插入请按1;删除请按2;寻找请按3"<

for(k=0;k=10;k++)

{

cin>>y;

if(y==1)

{

cout<<"请输入插入位置和元素的值:

"<

cin>>m>>n;

ListInsert_Sq(List,m,n);

disp(List);

}

elseif(y==2)

{

cout<<"请输入要删除第几个元素:

"<

cin>>m;

ListDelete_Sq(List,m,j);

cout<

disp(List);

}

else

{

cout<<"请输入所要查找的元素:

"<

cin>>m;

cout<

}

}

cout<

}

 运行结果:

 

 加强、提高题:

2、编写一个求解Josephus问题的函数。

用整数序列1,2,3,……,n表示顺序围坐在圆桌周围的人。

然后使用n=9,s=1,m=5,以及n=9,s=1,m=0,或者n=9,s=1,m=10作为输入数据,检查你的程序的正确性和健壮性。

最后分析所完成算法的时间复杂度。

定义JosephusCircle类,其中含完成初始化、报数出圈成员函数、输出显示等方法。

(可以选做其中之一)

加强题:

1、采用数组作为求解过程中使用的数据结构。

提高题:

2、采用循环链表作为求解过程中使用的数据结构。

运行时允许指定任意n、s、m数值,直至输入n=0退出程序。

源程序:

(1)加强:

#include

#include

#include

inta[100];

intjosephus(intn,ints,intm)

{

if(!

(n*s*m))

{

cout<<"输入错误!

!

!

"<

exit(0);

}

intx=1,y=n;

inti=s-1;

intj;

while(y)

{

for(i=0;i

{

if(a[i]+1)

a[i]=x++;

if(a[i]==m)

{a[i]=-1;

cout<

"<

x=1;

y--;

}

}

for(j=0;j

{

if(a[j]+1)

a[j]=x++;

if(a[j]==m)

{

a[j]=-1;

x=1;

y--;

if(!

y)

break;

else

cout<

"<

}

}

}

return(j+1);

}

voidmain()

{

intn,s,m,y=0;

intx;

do{

for(inti=0;i<100;i++)

{a[i]=0;}

cout<<"请输入参加游戏的总人数:

"<

cin>>n;

cout<<"请输入开始人的位置与报数长度:

"<

cin>>s;

cin>>m;

x=josephus(n,s,m);

cout<

"<

cout<<"请选择:

"<

cout<<"1.重新游戏。

2.退出程序。

:

"<

cin>>y;

}while(y==1);

getch();

}

 运行结果:

 

(2)提高:

#include

usingnamespacestd;

typedefstructLNode

{

structLNode*next;

inta;

}LNode,*LinkList;

classJosephouCircle//定义一个类包括三个元素

{

public:

voidSetValue();

voidPickOut();

private:

intn;

ints;

intm;

};

voidJosephouCircle:

:

SetValue()//设置初值的大小

{

cout<<"请输入参加游戏的总人数:

"<

cin>>n;

cout<<"请输入开始人的位置:

"<

cin>>s;

cout<<"请输入报数长度:

"<

cin>>m;

}

voidJosephouCircle:

:

PickOut()

{

LinkListL;

LNode*p,*q;

intj,k;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

LNode*r;

r=L;

for(inti=1;i<=n;++i)//构建一个循环链表

{

p=(LinkList)malloc(sizeof(LNode));

p->a=i;

p->next=NULL;

r->next=p;

r=p;

}

p->next=L->next;

p=L->next;

j=1;

while(p&&j

{

p=p->next;++j;

}

for(i=1;i<=n;i++)

{

for(j=1;j

{

p=p->next;

}

q=p->next;p->next=q->next;

p=q->next;

k=q->a;

cout<<"输出的结果为:

"<

free(q);

}

}

intmain(intargc,char*argv[])

{

JosephouCircleJo1;

Jo1.SetValue();

Jo1.PickOut();

return0;

}

 运行结果:

 

 四、实验体会与总结

1、对于线性链表和顺序表都属于线性表问题,但是线性链表比顺序表要灵活,方便;

2、线性表在做元素寻找的操作的时候,必须从头结点开始寻找。

体会:

在编程序的时候,我们每个人肯定会遇到许多问题,我遇到的问题是:

当我在运行程序的时候,在输入一个元素后,程序就不继续做下面的操作也不停止运行,自己寻找并修改了好久都没发现问题的所在,最后实在没办法,就去问同学,结果终于发现是一条语句在编写时出现了错误。

所以,以后再写程序的时候我一定要再认真仔细一点仔细点。

 

教师评价

 

 

 

及格

 

不及格

 

教师签名

 

日期

 

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

当前位置:首页 > 初中教育 > 中考

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

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