数据结构实验.docx
- 文档编号:6354234
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:59
- 大小:193.74KB
数据结构实验.docx
《数据结构实验.docx》由会员分享,可在线阅读,更多相关《数据结构实验.docx(59页珍藏版)》请在冰豆网上搜索。
数据结构实验
实验一熟悉编程环境
一、实验目的
1.熟悉C语言编译环境,掌握C程序的编写、编译、运行和调试过程。
2.能熟悉的将C程序存储到指定的位置。
二、实验内容
1.编写一个输入学生2门课程成绩的函数(2门课程成绩存到结构体数组中,结构体包括:
课程编号,课程名称,课程成绩)。
并求出这2门课程的平均分,最小值,最大值。
2.程序如下:
#include
typedefstruct
{
intcourse_num;
charcourse_name[10];
floatcourse_score;
}course;
floatave(course*cour,inti)
{
intj=0;
floatav=0;
for(j=0;j
{
av+=cour[j].course_score;
}
av/=i;
cout<<"theaverageis\t";
cout< returnav; } floatmaxi(course*cour,inti) { intj=0; floatmaxx; maxx=cour[0].course_score; for(j=1;j {if(maxx maxx=cour[j].course_score; } cout<<"themaximumis\t"; cout< returnmaxx; } floatmini(course*cour,inti) { intj=0; floatmin; min=cour[0].course_score; for(j=1;j {if(min>cour[j].course_score) min=cour[j].course_score; } cout<<"theminimizeis\t"; cout< returnmin; } voidinput(course*cour,inti) { intj; for(j=0;j { cin>>cour[j].course_num; cin>>cour[j].course_name; cin>>cour[j].course_score; } } voidoutput(course*cour,inti) { intj; for(j=0;j { cout< cout< cout< cout<<"\n"; } } voidmain() { floatmax,min; coursec[10]; floataveg; cout<<"pleaseinputmum,name,score: \n"; 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.程序如下: #include #include #defineLIST_INIT_LIST100 #defineLISTINCREMENT10 #definenull0 typedefstruct { 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) returnnull; if(L.length>=L.listsize) { newbase=(int*)realloc(L.elem,(LIST_INIT_LIST+LISTINCREMENT)*sizeof(int)); if(! 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++; return1; } intdeletSqlist(Sqlist&L,inti,int&e) { intj; if(i<1||i>L.length+1) returnnull; if(L.length<=0) returnnull; e=L.elem[i-1]; for(j=i;j<=L.length-1;j++) L.elem[j-1]=L.elem[j]; --L.length; return1; } voidtraverSqlist(Sqlist&L) { inti; for(i=0;i<=L.length-1;i++) cout< } voidmain() { SqlistL; inti,j,n,k,e,g; initSqlist(L); cout<<"pleaseinputhownumberyouwant: \n"; cin>>n; cout<<"pleaseinputnumber: \n"; for(i=1;i<=n;i++) { cin>>e; inserSqlist(L,i,e); } traverSqlist(L); cout<<"\n"; cout<<"pleaseinputwhichnumberyouwanttodelete: \n"; cin>>k; deletSqlist(L,k,g); traverSqlist(L); cout<<"\n"; } 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>=i-1;j--)还能成立并执行,理论上理解,可是一句一句翻译还是不太懂,我还会查阅资料继续寻求答案的。 实验三、单链表的基本操作 一、实验目的 1.掌握线性表的链式结构存储及基本操作,深入了解链表的基本特征,以便在实际问题背景下灵活运用它们。 2.巩固该存储的构造方法,深入了解和灵活掌握链表的插入、删除等操作。 二、实验内容 1.定义一个链表结构,并定义带头结点的单链表,实现单链表的建立、初始化、插入、删除等函数实现。 2.定义两个链表,从小到大输入数据,并将两个链表进行从小到大排序。 3.程序如下: #include #include #definenull0 typedefstructLnode { intdata; structLnode*next; }Lnode; Lnode*initlist() { Lnode*H; H=(Lnode*)malloc(sizeof(Lnode)); if(! H) returnnull; H->next=null; returnH; } intinserLnode(Lnode*L,inti,inte) { intj; Lnode*p,*q; p=(Lnode*)malloc(sizeof(Lnode)); p->data=e; q=L; for(j=0;j { q=q->next; } if(j>i&&q->next! =null) returnnull; p->next=q->next; q->next=p; return1; } intdeletLnode(Lnode*L,inti,int&e) { intj; Lnode*p,*q; q=L; for(j=0;j { q=q->next; } if(j>i&&q->next! =null) returnnull; e=q->data; p=q->next; q->next=p->next; return1; } inttravellLnode(Lnode*L) { intj=0; Lnode*q; q=L; while(q->next! =null) { q=q->next; cout< } return1; } voidcreateLnode(Lnode*L) { inti,n; intdata; cout<<"inputnumyouwantto\n"; cin>>n; cout<<"inputnum: \n"; for(i=1;i<=n;i++) { cin>>data; inserLnode(L,i,data); } cout<<"thenumis: \n"; travellLnode(L); cout<<"\n"; } voidhebingLnode(Lnode*La,Lnode*Lb) { Lnode*Lc,*pa,*pb,*pc; pa=La->next;pb=Lb->next; Lc=pc=La; while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } if(! pa)pc->next=pb; if(! pb)pc->next=pa; free(Lb); cout<<"thenumis: \n"; travellLnode(Lc); cout<<"\n"; } voidmain() { 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 插入函数是插入在那个数的后面,所以在i位置插入函数,就要找到第i-1那个数。 然后就是在合并两个链表的函数hebingLnode中,Lc=pc=La,还有pc->next=pa;pc=pa;pa=pa->next;没有弄的太明白,老是忘记这是个链表结构,还有头结点,而且没弄懂把Lc的指针直接指向La,老是感觉会破坏La的后面的数据,后来才明白,这是个链表结构,不是顺序表,这样做只是利用La的头结点,就不用再去创建一个头结点了。 所以在后面也就不用free(La)了,最后一个错误就是在合并函数中将if(! pa)pc->next=pb;,语句写成了if(! pa)pc->next=pa,这就是pa指针没了,还把pa指针赋值给pc,也就是空值,以至于在输出时只输出La的值,后来也是看书找到了答案。 实验四、栈的基本操作 一、实验目的 1.掌握栈的抽象数据类型。 2.掌握实现栈的各种操作。 3.理解栈与递归的关系。 二、实验内容 1.用C描述栈的美中操作在顺序栈上得实现。 2.将建栈、初始化栈、判断是否非栈、用堆栈设计一个八进制转换程序。 3.程序如下: #include #include #defineSTACK_INIT_SIZE100 #defineSTACKINCREAEMNT10 #definenull0 typedefstruct { int*base; int*top; intstacksize; }Sqstack; structinitSqstack(Sqstack&L) { L.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(! L.base) return0; L.top=L.base; L.stacksize=STACK_INIT_SIZE; return1; } intpush(Sqstack&L,inte) { if(L.top-L.base>=L.stacksize) {L.base=(int*)realloc(L.base,(STACK_INIT_SIZE+STACKINCREAEMNT)*sizeof(int)); if(! L.base) return0; L.top=L.base+L.stacksize; L.stacksize+=STACKINCREAEMNT; } *L.top++=e; return1; } voidpop(Sqstack&L,int&e) { if(L.base==L.top) cout<<"thisstackisempty! \n"; e=*--L.top; } intmain() { intn,m; SqstackL; initSqstack(L); cout<<"inputnumyouwantto: \n"; cin>>n; while(n) { push(L,n%8); n=n/8; } cout<<"它的八进制表示为: \n"; while(L.top! =L.base) { pop(L,m); cout< } cout<<"\n"; return1; } 4.实验结果如下图4.1。 图4.1实验结果 三、实验心得 本次实验,刚开始在没搞清楚堆栈到底是什么的情况下,开始盲目写程序,还写了个travell浏览数据函数,却不知道,这浏览函数,就跟出栈函数的意思差不多,然后再去运行出栈函数,因为top==base了,所以运行出错,又查看了下书本,才意识过来。 又一次彻底的知道了堆栈的先进后出,以后会更小心的。 实验五、队列的基本操作 一、实验目的 1.掌握队列的抽象数据类型。 2.掌握实现队列的各种操作的算法。 3.掌握队列的链式存储就够及基本操作,深入了解链式队列的基本特征,以便在实际问题背景下灵活运用它们。 二、实验内容 1.用C表述每种操作在链队列上的实现。 2.将建立一个链式队列,初始化队列,完成其插入删除操作。 3.程序如下: #include #include #definenull0 typedefstructQnode { intdata; structQnode*next; }Qnode; typedefstruct { Qnode*front; Qnode*rear; }LinkQnode; intinitLinkQnode(LinkQnode&Q) { Q.front=Q.rear=(Qnode*)malloc(sizeof(Qnode)); if(! Q.front) return0; Q.front->next=null; return1; } intinserLinkQnode(LinkQnode&Q,inte) { Qnode*p; p=(Qnode*)malloc(sizeof(Qnode)); if(! p) return0; p->data=e; p->next=null; Q.rear->next=p; Q.rear=p; return1; } intdeletLinkQnode(LinkQnode&Q,int&e) { Qnode*p; if(Q.front==Q.rear) return0; p=Q.front->next; Q.front->next=p->next; e=p->data; returne; } voidtravellLinkQnode(LinkQnode&Q) { Qnode*q; q=Q.front->next; do { cout< q=q->next; }while(q! =Q.rear->next); cout<<"\n"; } voidmain() { inti,n,m,k,data; LinkQnodeS; initLinkQnode(S); cout<<"pleaseinputnum\n"; cin>>n; cout<<"inputwhatyouwant\n"; for(i=1;i<=n;i++) { cin>>data; inserLinkQnode(S,data); } travellLinkQnode(S); cout<<"deleteanum\n"; deletLinkQnode(S,m); travellLinkQnode(S); cout<<"deleteanum\n"; deletLinkQnode(S,k); travellLinkQnode(S); } 4.实验结果如下图5.1。 图5.1实验结果 三、实验心得 这个实验真的很难做感觉,首先是不理解单链表到底是什么意思,就开始敲程序,结果错的乱七八糟,错误最多的还是在travellLink函数如何将这个链表的数据输出出来,刚开始我定义了一个指针p,就是在q=Q.front->next还是q=Q.front,错了好多次,就是因为不知道什么事头结点,还有就是把Q.front当成是这个链表的头结点,结果错了,才知道Q.front和Q.rear只是一个指向头结点的指针,而头结点另有所在。 而后又在travellLink函数的while(q! =Q.rear->next)上绊了一大脚,依旧是不知道是应该是while(q->next! =Q.rear->next),后来经过反反复复尝试加上看书本理解队列的头结点问题,在解开。 最后,又在删除元素上出错了,原因是忘记了列队的只能从Q.front的那一边删除元素,后来终于全部运行出来。 实验六、无头结点的循环链表 一、实验目的 1.理解头结点的含义。 2.掌握循环链表的各种操作算法。 3.掌握无头节点循环链式存储结构的及基本操作,深入了解无头节点循环链式表的基本特征。 以便在实际中灵活的运用它们。 二、实验内容 1.用C表述每种操作在链队列上的实现。 2.将建立一个无头节点循环链式表,完成在这个链式表上每第三个数删掉数据,结果输出来。 3.程序如下: #include #include #definenull0 typedefstructQnode { intdata; structQnode*next; }Qnode; voidinserQnode(Qnode*L,inti,inte) { intj; Qnode*p,*q; p=(Qnode*)malloc(sizeof(Qnode)); p->data=e; q=L; for(j=0;j { q=q->next; } p->next=q->next; q->next=p; } voiddeletQnode(Qnode*L) { inte; Qnode*p,*q; p=L; do { p=p->next; q=p->next; p->next=q->next; e=q->data; cout< free(q); p=p->n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验