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