算法与数据结构实验册.docx
- 文档编号:25148151
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:33
- 大小:31.49KB
算法与数据结构实验册.docx
《算法与数据结构实验册.docx》由会员分享,可在线阅读,更多相关《算法与数据结构实验册.docx(33页珍藏版)》请在冰豆网上搜索。
算法与数据结构实验册
实验报告书写要求
实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。
纸张一律采用A4的纸张。
实验报告书写说明
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。
各院部可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。
实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:
顺序表实验学时:
2
同组学生姓名:
全班同学实验地点:
1318
实验日期:
10月14号实验成绩:
批改教师:
批改时间:
实验1顺序表
一、实验目的和要求
掌握顺序表的定位、插入、删除等操作。
二、实验仪器和设备
TurboC2.0
三、实验内容与过程(含程序清单及流程图)
1、必做题
(1)编写程序建立一个数续表,并逐个输出顺序表中所有数据元素的值。
编写主函数测试结果。
(2)编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。
如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号从0开始编号);如果不存在,返回-1。
编写主函数测试结果。
(3)在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。
解题思路:
首先查找插入的位置,再移位,最后进行插入操作;从第一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将新结点x插入到i位置。
(4)删除顺序表中所有等于X的数据元素。
2、选做题
(5)已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素)。
程序清单:
第一题:
#include
#definemaxsize100
typedefstruct{
intdatatype[maxsize];
intlast;
}sequenlist;
voidmain(){
sequenlista={{1,2,3,4},4};
for(inti=0;i printf("%d",a.datatype[i]); } } 第二题: #include #definemaxsize100 typedefstruct{ intdatatype[maxsize]; intlast; }sequenlist; intsearch(sequenlista,intx){ for(inti=0;i if(a.datatype[i]==x){ return(i); } } return(-1); } voidmain(){ sequenlista={{1,2,3,5,6},5}; intb=1; printf("%d",search(a,b)); } 第三题: #include #definemaxsize100 typedefstruct{ intdatatype[maxsize]; intlast; }sequenlist; sequenlistinsert(sequenlista,intx){ for(inti=0;i if(a.datatype[i]>=x){ for(intj=a.last;j>i;j--){ a.datatype[j]=a.datatype[j-1]; } a.datatype[i]=x; a.last=a.last+1; return(a); } } returna; } voidmain(){ sequenlista={{1,2,3,4,5,6},6}; sequenlistc; intb=1; c=insert(a,b); for(inti=0;i printf("%d",c.datatype[i]); } } 第四题: #include #definemaxsize100 typedefstruct{ intdatatype[maxsize]; intlast; }sequenlist; sequenlistdele(sequenlista,intx){ for(inti=0;i if(a.datatype[i]==x){ for(intj=i;j a.datatype[j]=a.datatype[j+1]; } a.last=a.last-1; } } returna; } voidmain(){ sequenlista={{1,2,3,4,5},5}; sequenlistb; intx=4; b=dele(a,x); for(inti=0;i printf("%d",b.datatype[i]); } } 第五题: #include #definemaxsize100 typedefstruct{ intdatatype[maxsize]; intlast; }sequenlist; sequenlistcombine(sequenlista,sequenlistb){ inti=0; sequenlistc; c.last=0; intj=a.last-1; inth=b.last-1; while(j>=0&&h>=0){ if(a.datatype[j]>=b.datatype[h]){ c.datatype[i++]=a.datatype[j--]; c.last++; } else{ c.datatype[i++]=b.datatype[h--]; c.last++; } } if(j==-1&&h>=0){ while(h>=0){ c.datatype[i++]=b.datatype[h--]; c.last++; } returnc; } elseif(j>=0&&h==-1){ while(j>=0){ c.datatype[i++]=a.datatype[j--]; c.last++; } returnc; } returnc; } voidmain(){ sequenlista={{1,3,4,5,7,8},6}; sequenlistb={{2,3,4,5,6},5}; sequenlistc=combine(a,b); for(inti=0;i printf("%d",c.datatype[i]); } } 四、实验结果与分析(程序运行结果及其分析) 第一题: 1234 此题即直接输出 第二题: 0 此题输出1的位置为0 第三题: 112345 此题插入一个新节点1后有序输出 第四题: 1235 此题删除一个节点4 第五题: 8765443321 此题用一个新的顺序表存储新的序列 五、实验体会(遇到问题及解决办法,编程后的心得体会) 我认为第三题和第五题比较有挑战性,第三题写了insert函数,但此时实参给实参的传递是值传递,因此要在函数体内写输出函数或把新的书序表返回给主函数;第五题有很多易错地方,要做到仔细细心! 第五题的解题思路是: 分别把两个书序表从后往前比较,谁大谁的值就赋值新的序列表,并且把记录它下标的值减一;如果有一个序列表的值已经赋值完毕,就把另一个序列表的剩下的值从后往前依次赋值给新的序列表。 实验项目名称: 单链表实验学时: 2 同组学生姓名: 全班同学实验地点: 1318 实验日期: 10月21号实验成绩: 批改教师: 批改时间: 实验2单链表 一、实验目的和要求 1、实验目的 掌握单链表的定位、插入、删除等操作。 2、实验要求 (1)注意链表的空间是动态分配的,某结点不用之后要及时进行物理删除,以便释放其内存空间。 (2)链表不能实现直接定位,一定注意指针的保存,防止丢失。 二、实验仪器和设备 TurboC2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)编写程序建立一个单链表,并逐个输出单链表中所有数据元素。 (2)在递增有序的单链表中插入一个新结点x,保持单链表的有序性。 解题思路: 首先查找插入的位置然后进行插入操作;从第一个结点开始找到第一个大于该新结点值的结点即为插入位置;然后在找到的此结点之前插入新结点;注意保留插入位置之前结点的指针才能完成插入操作。 (3)编写实现带头结点单链表就地逆置的子函数,并编写主函数测试结果。 2、选做题 已知指针LA和LB分别指向两个无头结点单链表的首元结点。 要求编一算法实现,从表LA中删除自第i个元素起共len个元素后,将它们插入到表LB中第j个元素之前。 程序清单: 第一题: #include #include typedefstructnode{ intdata; structnode*next; }linklist; voidmain(){ linklist*head,*r,*p; inta; head=malloc(sizeof(linklist)); while(r! =NULL){ printf("%d",r->data); r=r->next; } } 第二题: #include #include typedefstructnode{ intdata; structnode*next; }linklist; voidmain(){ linklist*head,*r,*p,*q; inta; head=malloc(sizeof(linklist)); r=head; printf("请输入原链表的值: (输入0时将结束输入)\n"); scanf("%d",&a); while(a! =0){ p=malloc(sizeof(linklist)); p->data=a; r->next=p; r=p; scanf("%d",&a); } r->next=NULL; 第三题: #include"stdio.h" #include"stdlib.h" typedefstructnode{ intdata; structnode*next; }linklist; main(){ inta; linklist*head,*s,*r,*p,*q,*t; head=malloc(sizeof(linklist)); r=head; printf("Inputsomenumbers: "); scanf("%d",&a); while(a! =0){ s=malloc(sizeof(linklist)); s->data=a; r->next=s; r=s; scanf("%d",&a); } r->next=NULL; printf("\nThelinklistbeforechangedis: \n"); p=head->next; while(p){ printf("%d",p->data); p=p->next; } p=head->next; q=p->next; while(q! =NULL){ t=q->next; q->next=p; p=q; q=t; } head->next->next=NULL; head->next=p; q=a; while(q->next! =NULL){ q=q->next;//q指向a的尾节点; scanf("%d",&h1); printf("请输入第从一条链的第i个元素删除几个元素\n"); scanf("%d",&h2); printf("请输入在第二条链的第几个元素前开始插入\n"); scanf("%d",&h3); b=fun(a,b,h1,h2,h3); printf("修改后的链表为: \n"); while(b! =NULL){ printf("%d",b->data); b=b->next; } } r=head; scanf("%d",&a); while(a! =0){ p=malloc(sizeof(linklist)); p->data=a; r->next=p; r=p; scanf("%d",&a); } r=head->next; p=malloc(sizeof(linklist)); printf("请输入插入节点的值: \n"); scanf("%d",&p->data); p->next=NULL; r=head->next; q=head; if(head->next==NULL){ head->next=p; } else{ while(r! =NULL&&r->data q=q->next; r=r->next; } p->next=r; q->next=p; }//q指向r的前一个节点 r=head->next; printf("插入后的链表是: \n"); while(r! =NULL){ printf("%d",r->data); r=r->next; } } printf("\nAfterchanged: \n"); p=head->next; while(p! =NULL){ printf("%d",p->data); p=p->next; } } 第四题: #include #include typedefstructnode{ intdata; structnode*next; }linklist; linklist*fun(linklist*a,linklist*b,inti,intlen,intj){ linklist*p,*q,*r,*z; inth; p=a; if(i==1){ q=p; for(h=1;h<=len;h++){ q=q->next;//q指向第len+1个节点 } a=q; } else{ for(h=1;h p=p->next;//p指向第i-1个节点 } q=p->next; for(h=1;h<=len;h++){ q=q->next;//q指向第len+1个节点 } p->next=q;//链表a中已经删除了len个节点 } p=b; 四、实验结果与分析(程序运行结果及其分析) 第一题: 12345 此题较简单建立链表后可以直接输出(运用指针后移直至指针指向空) 第二题: 请输入原链表的值: (输入0时将结束输入) 123450 请输入插入节点的值: 2 插入后的链表是: 122345 此题要思考全面特别是原链表为空或插入节点比原链表的任意一个节点都大时要考虑到! 第三题: 请输入单链表: (以0结束) 123450 逆置后的链表是: 54321 此题用p指向一个节点q指向p的前一个节点,p的指针域指向q.此时应该用一个指针记录p的后继节点,因为一旦p的指针指向q时将找不到p的后继节点! 第四题: 请输入要建立的链表: (以0结束) 123450 请输入要建立的链表: (以0结束) 123450 请输入在第一条链的第几个元素开始删除: 1 请输入从第一条链的第i个元素删除几个元素: 4 修改后的链表为: 512345 五、实验体会(遇到问题及解决办法,编程后的心得体会) 本次试验最要花心思的是第四题因为其需要分情况讨论,比如是从第一条的第一个元素开始删除还是从其他元素。 插入的时候是从第二条链的第一个元素开始插入还是从其他位置插入等。 实验项目名称: 堆栈和队列实验学时: 2 同组学生姓名: 全班同学实验地点: A203 实验日期: 10月28号实验成绩: 批改教师: 批改时间: 实验3堆栈和队列 一、实验目的和要求 (1)掌握应用栈解决问题的方法。 (2)掌握利用栈进行表达式求和的算法。 (3)掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。 二、实验仪器和设备 TurboC2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)判断一个算术表达式中开括号和闭括号是否配对。 (2)测试“汉诺塔”问题。 (3)假设称正读和反读都相同的字符序列为”回文”,试写一个算法判别读入的一个以’@’为结束符的字符序列是否是“回文”。 2、选做题 在顺序存储结构上实现输出受限的双端循环队列的入列和出列算法。 设每个元素表示一个待处理的作业,元素值表示作业的预计时间。 入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。 程序清单: 第一题: #include #definemaxsize100 typedefstruct{ chardata[maxsize]; inttop; }seqstack; voidmain(){ seqstackb; chara; b.top=0; b.top--; } } a=getchar(); } if(b.top==0){printf("配对成功");} else{printf("配对不成功");} } 第二题: #include voidhanoi(intn,chara,charb,charc){ if(n==1) printf("\nMovedisk%dfrompile%ctopile%c",n,a,c);//n等于1时只需把盘子1移向c; else{ hanoi(n-1,a,c,b);//把n-1个盘子移向B printf("\nMovedisk%dfrompile%ctopile%c",n,a,c);//把第n个盘子移向C hanoi(n-1,b,a,c);//把n-1个盘子移向C } } i++; a.top++; } a.top--;i for(i=0;str[i]! ='@';i++){ if(a.data[a.top]==str[i]){ a.top--;} } if(a.top==-1){ printf("是回文数");} else printf("不是回文数"); } 第四题: #include #definemaxsize100 typedefstruct{ intdata[maxsize]; intfront; intrear; }sequeue; voidruDui(sequeue*a,intx){ intaver; if(a->front==(a->rear+1)%maxsize){ printf("列满"); } else{ aver=(a->data[a->rear]+a->data a=getchar(); while(a! ='0'){ if(a=='('){ b.top++; b.data[b.top]=a; } if(a==')'){ if(b.top==0){ printf("不配对"); exit(); }else{ voidmain(){ intn; printf("\nPleaseenterthenumberofdiskstobemoved: "); scanf("%d",&n); hanoi(n,'A','B','C'); } //不需知道盘子是怎么移动的,只要知道移动n+1个盘子与移动n个盘子的关系,即移动N+1个盘子到C即是吧N个盘子移向b,再把第N个盘子 //移向C,最后再把那N个盘子移向C第三题: #include typedefstruct{ chardata[100]; inttop; }seqstack; voidmain(){ inti=0; charstr[20]; seqstacka; a.top=0; gets(str); while(str[i]! ='@'){ a.data[a.top]=str[i]; [a->front+1])/2; if(x a->front--; a->data[a->front+1]=x; } else{ a->rear=(a->rear+1)%maxsize; a->data[a->rear]=x; } } } voidchuDui(sequeue*a){ if(a->rear==a->fr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)