数据结构实验Word下载.docx

上传人:b****5 文档编号:19364703 上传时间:2023-01-05 格式:DOCX 页数:59 大小:193.74KB
下载 相关 举报
数据结构实验Word下载.docx_第1页
第1页 / 共59页
数据结构实验Word下载.docx_第2页
第2页 / 共59页
数据结构实验Word下载.docx_第3页
第3页 / 共59页
数据结构实验Word下载.docx_第4页
第4页 / 共59页
数据结构实验Word下载.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

数据结构实验Word下载.docx

《数据结构实验Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验Word下载.docx(59页珍藏版)》请在冰豆网上搜索。

数据结构实验Word下载.docx

floatmaxx;

maxx=cour[0].course_score;

for(j=1;

{if(maxx<

cour[j].course_score)

maxx=cour[j].course_score;

themaximumis\t"

maxx<

returnmaxx;

floatmini(course*cour,inti)

floatmin;

min=cour[0].course_score;

{if(min>

min=cour[j].course_score;

theminimizeis\t"

min<

returnmin;

 

voidinput(course*cour,inti)

intj;

cin>

>

cour[j].course_num;

cour[j].course_name;

cour[j].course_score;

voidoutput(course*cour,inti)

cour[j].course_num<

\t"

cour[j].course_name<

\t\t"

cour[j].course_score<

voidmain()

floatmax,min;

coursec[10];

floataveg;

pleaseinputmum,name,score:

input(c,2);

output(c,2);

aveg=ave(c,2);

max=maxi(c,2);

min=mini(c,2);

3.运行结果见下图1.1。

图1.1运行结果

三、实验心得

在本次实验中,在刚开始不知道结构体是什么了,后来,看了看C语言书还有听老师讲,知道了,然后在实验中,刚开始在intmain()需要有一个返回值,没写出来,还有statusmain和voidmain和intmain分不清,问老师才知道,再后来就是在对参数刚开始没有赋值,屡屡出错,最后又是翻C语言书找到了答案。

总之第一次实验各种问题,好的是最后还是克服了,希望以后的实验越来越好。

实验二顺序表的基本操作

一、实验目的

1.掌握顺序表的建立、数据元素的插入和删除、掌握数据元素的访问。

2.能够熟练使用函数来实现表的各种操作。

1.定义一个顺序表类型,并定义顺序表。

2.实现顺序表的建立、初始化、插入、删除。

3.程序如下:

malloc.h>

#defineLIST_INIT_LIST100

#defineLISTINCREMENT10

#definenull0

int*elem;

intlength;

intlistsize;

}Sqlist;

intinitSqlist(Sqlist&

L)

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

if(!

L.elem)

returnnull;

L.length=0;

L.listsize=LIST_INIT_LIST;

return1;

intinserSqlist(Sqlist&

L,inti,inte)

intj,*newbase;

if(i<

1||i>

L.length+1)

if(L.length>

=L.listsize)

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

newbase)

returnnull;

L.elem=newbase;

L.listsize+=LISTINCREMENT;

for(j=L.length-1;

j>

=i-1;

j--)

L.elem[j+1]=L.elem[j];

L.elem[i-1]=e;

L.length++;

intdeletSqlist(Sqlist&

L,inti,int&

e)

if(L.length<

=0)

e=L.elem[i-1];

for(j=i;

=L.length-1;

L.elem[j-1]=L.elem[j];

--L.length;

voidtraverSqlist(Sqlist&

inti;

for(i=0;

i<

i++)

cout<

L.elem[i]<

SqlistL;

inti,j,n,k,e,g;

initSqlist(L);

pleaseinputhownumberyouwant:

n;

pleaseinputnumber:

for(i=1;

=n;

e;

inserSqlist(L,i,e);

traverSqlist(L);

pleaseinputwhichnumberyouwanttodelete:

k;

deletSqlist(L,k,g);

4.运行结果见下图2.1.

图2.1顺序表运行结果

三、实验心得

本次试验,算是刚刚开始正面接触数据结构,感觉现在定义的结构体都好难,基本上都跟指针挂钩,有点不适应。

刚开始都是照着书本打,可是这又有新问题了,主函数不会写,不知道从哪入手。

看了看书,开始下手,各种错误,比如指针类型不能跟int数值类型相互赋值,还有一些丢了双引号等等,后来逐一排查错误后,又在主函数赋值i和调用函数的相应值之间出错,还有在traverSqlist函数中,把i<

=L.length-1写成i<

=L.length,导致老是输出少一个数,以至于我老师检查主函数和调用函数的i值问题,才发现找错方向了。

现在唯一还有疑问的就是明明初始化函数是L.length=0了而i=1,为什么在inserSqlist函数的(j=L.length-1;

j--)还能成立并执行,理论上理解,可是一句一句翻译还是不太懂,我还会查阅资料继续寻求答案的。

实验三、单链表的基本操作

1.掌握线性表的链式结构存储及基本操作,深入了解链表的基本特征,以便在实际问题背景下灵活运用它们。

2.巩固该存储的构造方法,深入了解和灵活掌握链表的插入、删除等操作。

1.定义一个链表结构,并定义带头结点的单链表,实现单链表的建立、初始化、插入、删除等函数实现。

2.定义两个链表,从小到大输入数据,并将两个链表进行从小到大排序。

typedefstructLnode

intdata;

structLnode*next;

}Lnode;

Lnode*initlist()

Lnode*H;

H=(Lnode*)malloc(sizeof(Lnode));

H)

H->

next=null;

returnH;

intinserLnode(Lnode*L,inti,inte)

Lnode*p,*q;

p=(Lnode*)malloc(sizeof(Lnode));

p->

data=e;

q=L;

i-1;

q=q->

next;

if(j>

i&

&

q->

next!

=null)

next=q->

q->

next=p;

intdeletLnode(Lnode*L,inti,int&

e=q->

data;

p=q->

next=p->

inttravellLnode(Lnode*L)

Lnode*q;

while(q->

data<

voidcreateLnode(Lnode*L)

inti,n;

inputnumyouwantto\n"

inputnum:

cin>

inserLnode(L,i,data);

thenumis:

travellLnode(L);

voidhebingLnode(Lnode*La,Lnode*Lb)

Lnode*Lc,*pa,*pb,*pc;

pa=La->

pb=Lb->

Lc=pc=La;

while(pa&

pb)

if(pa->

=pb->

data)

{

pc->

next=pa;

pc=pa;

pa=pa->

}

else

pc->

next=pb;

pc=pb;

pb=pb->

pa)pc->

pb)pc->

free(Lb);

travellLnode(Lc);

Lnode*L1;

Lnode*L2;

L1=initlist();

createLnode(L1);

L2=initlist();

createLnode(L2);

hebingLnode(L1,L2);

4.实验结果如下图3.1。

图3.1实验结果

本次试验,依旧实在插入函数inserLnode的循环语句for(j=0;

j++)的就j<

i-1输成了j<

i,以至于只输出一位数就停止了,后来翻翻书,找到了答案。

插入函数是插入在那个数的后面,所以在i位置插入函数,就要找到第i-1那个数。

然后就是在合并两个链表的函数hebingLnode中,Lc=pc=La,还有pc->

pc=pa;

pa=pa->

没有弄的太明白,老是忘记这是个链表结构,还有头结点,而且没弄懂把Lc的指针直接指向La,老是感觉会破坏La的后面的数据,后来才明白,这是个链表结构,不是顺序表,这样做只是利用La的头结点,就不用再去创建一个头结点了。

所以在后面也就不用free(La)了,最后一个错误就是在合并函数中将if(!

,语句写成了if(!

next=pa,这就是pa指针没了,还把pa指针赋值给pc,也就是空值,以至于在输出时只输出La的值,后来也是看书找到了答案。

实验四、栈的基本操作

1.掌握栈的抽象数据类型。

2.掌握实现栈的各种操作。

3.理解栈与递归的关系。

1.用C描述栈的美中操作在顺序栈上得实现。

2.将建栈、初始化栈、判断是否非栈、用堆栈设计一个八进制转换程序。

#defineSTACK_INIT_SIZE100

#defineSTACKINCREAEMNT10

int*base;

int*top;

intstacksize;

}Sqstack;

structinitSqstack(Sqstack&

L.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));

if(!

L.base)

return0;

L.top=L.base;

L.stacksize=STACK_INIT_SIZE;

intpush(Sqstack&

L,inte)

if(L.top-L.base>

=L.stacksize)

{L.base=(int*)realloc(L.base,(STACK_INIT_SIZE+STACKINCREAEMNT)*sizeof(int));

if(!

return0;

L.top=L.base+L.stacksize;

L.stacksize+=STACKINCREAEMNT;

*L.top++=e;

voidpop(Sqstack&

L,int&

if(L.base==L.top)

thisstackisempty!

e=*--L.top;

intmain()

intn,m;

SqstackL;

initSqstack(L);

inputnumyouwantto:

while(n)

push(L,n%8);

n=n/8;

它的八进制表示为:

while(L.top!

=L.base)

pop(L,m);

m<

4.实验结果如下图4.1。

图4.1实验结果

本次实验,刚开始在没搞清楚堆栈到底是什么的情况下,开始盲目写程序,还写了个travell浏览数据函数,却不知道,这浏览函数,就跟出栈函数的意思差不多,然后再去运行出栈函数,因为top==base了,所以运行出错,又查看了下书本,才意识过来。

又一次彻底的知道了堆栈的先进后出,以后会更小心的。

实验五、队列的基本操作

1.掌握队列的抽象数据类型。

2.掌握实现队列的各种操作的算法。

3.掌握队列的链式存储就够及基本操作,深入了解链式队列的基本特征,以便在实际问题背景下灵活运用它们。

1.用C表述每种操作在链队列上的实现。

2.将建立一个链式队列,初始化队列,完成其插入删除操作。

typedefstructQnode

structQnode*next;

}Qnode;

Qnode*front;

Qnode*rear;

}LinkQnode;

intinitLinkQnode(LinkQnode&

Q)

Q.front=Q.rear=(Qnode*)malloc(sizeof(Qnode));

Q.front)

return0;

Q.front->

intinserLinkQnode(LinkQnode&

Q,inte)

Qnode*p;

p=(Qnode*)malloc(sizeof(Qnode));

p)

Q.rear->

Q.rear=p;

intdeletLinkQnode(LinkQnode&

Q,int&

if(Q.front==Q.rear)

p=Q.front->

e=p->

returne;

voidtravellLinkQnode(LinkQnode&

Qnode*q;

q=Q.front->

do

q=q->

}while(q!

=Q.rear->

next);

inti,n,m,k,data;

LinkQnodeS;

initLinkQnode(S);

pleaseinputnum\n"

inputwhatyouwant\n"

inserLinkQnode(S,data);

travellLinkQnode(S);

deleteanum\n"

deletLinkQnode(S,m);

deletLinkQnode(S,k);

4.实验结果如下图5.1。

图5.1实验结果

这个实验真的很难做感觉,首先是不理解单链表到底是什么意思,就开始敲程序,结果错的乱七八糟,错误最多的还是在travellLink函数如何将这个链表的数据输出出来,刚开始我定义了一个指针p,就是在q=Q.front->

next还是q=Q.front,错了好多次,就是因为不知道什么事头结点,还有就是把Q.front当成是这个链表的头结点,结果错了,才知道Q.front和Q.rear只是一个指向头结点的指针,而头结点另有所在。

而后又在travellLink函数的while(q!

next)上绊了一大脚,依旧是不知道是应该是while(q->

next),后来经过反反复复尝试加上看书本理解队列的头结点问题,在解开。

最后,又在删除元素上出错了,原因是忘记了列队的只能从Q.front的那一边删除元素,后来终于全部运行出来。

实验六、无头结点的循环链表

1.理解头结点的含义。

2.掌握循环链表的各种操作算法。

3.掌握无头节点循环链式存储结构的及基本操作,深入了解无头节点循环链式表的基本特征。

以便在实际中灵活的运用它们。

1.用C表述每种操作在链队列上的实现。

2.将建立一个无头节点循环链式表,完成在这个链式表上每第三个数删掉数据,结果输出来。

voidinserQnode(Qnode*L,inti,inte)

{

Qnode*p,*q;

i-2;

voiddeletQnode(Qnode*L)

inte;

p=L;

{

p=p->

q=p->

e<

free(q);

n

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

当前位置:首页 > 幼儿教育 > 家庭教育

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

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