129606229444843750《数据结构》实验指导书 最新版.docx
- 文档编号:12913969
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:87
- 大小:45.34KB
129606229444843750《数据结构》实验指导书 最新版.docx
《129606229444843750《数据结构》实验指导书 最新版.docx》由会员分享,可在线阅读,更多相关《129606229444843750《数据结构》实验指导书 最新版.docx(87页珍藏版)》请在冰豆网上搜索。
129606229444843750《数据结构》实验指导书最新版
目录
实验一线性表基本操作的编程实现1
实验二堆栈或队列基本操作的编程实现9
实验三串基本操作的编程实现15
实验四二维数组基本操作的编程实现18
实验五二叉树基本操作的编程实现21
实验六图基本操作的编程实现29
实验七查找技术的编程实现39
实验八排序技术的编程实现45
附录一实验常见问题问答52
附录二如何准备实验52
附录三如何写实验报告53
附录四实验报告书写标准53
(特别提示:
程序设计包含两个方面的错误。
其一是语法错误,其二是功能错误。
为了提高学生的编程和调试能力,本指导书给出的程序代码并不保证没有上述的两种错误。
并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的教学要求。
希望大家以自己所学高级语言的基本功和数据结构原理的思考点为基础,不要过于依赖给出的参考代码,这样才能有所进步。
如果学生能够根据要求完全自己编制,那就更好了。
)
实验一线性表基本操作的编程实现
【实验目的】
线性表基本操作的编程实现
要求:
线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结构中任选,可以完成部分主要功能,也可以用菜单进行管理完成大部分功能。
还鼓励学生利用基本操作进行一些更实际的应用型程序设计。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。
建议实现键盘输入数据以实现程序的通用性。
为了体现功能的正常性,至少要编制遍历数据的函数。
【注意事项】
1.开发语言:
使用C。
2.可以自己增加其他功能。
【思考问题】
1.线性表的顺序存储和链表存储的差异?
优缺点分析?
2.那些操作引发了数据的移动?
3.算法的时间效率是如何体现的?
4.链表的指针是如何后移的?
如何加强程序的健壮性?
【参考代码】
(一)利用顺序表完成一个班级学生课程成绩的简单管理
1、预定义以及顺序表结构类型的定义
(1)#defineListSize//根据需要自己设定一个班级能够容纳的最大学生数
(2)typedefstructStu
{
intnum;//学生的学号
charname[10];//学生的姓名
floatwuli;//物理成绩
floatshuxue;//数学成绩
floatyingyu;//英语成绩
}STUDENT;//存放单个学生信息的结构体类型
typedefstructList
{
stu[ListSize];//存放学生的数组定义,静态分配空间
intlength;//记录班级实际学生个数
}LIST;//存放班级学生信息的顺序表类型
2、建立班级的学生信息
voidlistcreate(LIST*Li,intm)//m为该班级的实际人数
{
inti;
Li->length=0;
for(i=0;i { printf("pleaseinputthe%dthstudent'sinformation: \n",i+1); printf("num="); scanf("%d",);//输入第i个学生的学号 printf("name="); scanf("%s",);//输入第i个学生的姓名 printf("wuli="); scanf("%f",);//输入第i个学生的物理成绩 printf("shuxue="); scanf("%f",);//输入第i个学生的数学成绩 printf("yingyu="); scanf("%f",);//输入第i个学生的英语成绩 Li->length++;//学生人数加1 } } 3、插入一个学生信息 intlistinsert(LIST*Li,inti)//将学生插入到班级Li的第i个位置。 { intj; STUDENTe; if()//测试存储空间是否被占满 { printf("无更多的存储空间! \n"); return0; } if()//插入位置检验,如果错误就返回0退出程序。 return0; else { printf("请输入插入的学生信息: "); printf("num=");scanf("%d",&e.num); printf("name=");scanf("%s",e.name); printf("wuli=");scanf("%f",&e.wuli); printf("shuxue=");scanf("%f",&e.shuxue); printf("yingyu=");scanf("%f",&e.yingyu); for(j=;j>=;j--)//从i位置到最后的元素依次往后移动 Li->stu[j+1]=Li->stu[j]; =e;//学生e放入到i位置 Li->length++;//学生实际人数加1 return1; } } 4、删除一个学生信息 intlistdel(LIST*Li,inti)//删除第i个学生的信息 { intj; if()//删除位置检验,如果错误就返回0退出程序。 return0; else { for(j=;j<;j++) //从删除位置后一个到最后的元素依次往前移动 Li->stu[j-1]=Li->stu[j]; Li->length--; return1; } } 5、显示所有学生信息 voidlistdisplay(LISTL) { inti; printf("班级学生信息如下: \n"); for(i=0;i<;i++) printf("%10d[学号]%10s[姓名]%10.2f[物理成绩]%10.2f[数学成绩]%10.2f[英语成绩]\n",L.stu[i].num,L.stu[i].name,L.stu[i].wuli,L.stu[i].shuxue,L.stu[i].yingyu); } 6、编写主函数main,要求测试以上所编写的listcreat、listinsert、listdel和listdisplay voidmain()//自己设计主函数完成 { } (二)利用单链表完成一个班级学生课程成绩的简单管理 1、单链表结构体类型的定义 typedefstructStu { intnum;//学生的学号 charname[10];//学生的姓名 floatwuli;//物理成绩 floatshuxue;//数学成绩 floatyingyu;//英语成绩 }STUDENT;//存放单个学生信息的结构体类型 typedefstructSnode { STUDENTdata;//结点的值 structSnode*link;//指向下一个结点的地址 }SNODE; 2、建立班级学生信息 SNODE*listcreate(intn)//n为该班级的实际人数 { inti; SNODE*head,*p,*q; if(n==0) returnNULL;//如果要创建的是空表,返回NULL head=p=(SNODE*)malloc(sizeof(SNODE));//动态建立第一个结点,head指针指向 printf("pleaseinputthe1thstudent'sinformation: \n"); printf("num=");scanf("%d",&p->data.num);//输入第1个学生的学号 printf("name=");scanf("%s",p->data.name);//输入第1个学生的姓名 printf("wuli=");scanf("%f",&p->data.wuli);//输入第1个学生的物理成绩 printf("shuxue=");scanf("%f",&p->data.shuxue);//输入第1个学生的数学成绩 printf("yingyu=");scanf("%f",&p->data.yingyu);//输入第1个学生的英语成绩 for(i=1;i { printf("\nThe%dthelement'sdata: \n",i+1); q=(SNODE*)malloc(sizeof(SNODE)); printf("num=");scanf("%d",&q->data.num); printf("name=");scanf("%s",q->data.name); printf("wuli=");scanf("%f",&q->data.wuli); printf("shuxue=");scanf("%f",&q->data.shuxue); printf("yingyu=");scanf("%f",&q->data.yingyu); q->link=NULL; } } 3、插入一个学生信息 intlistinsert(SNODE**Li_head,inti)//将学生插入到班级Li_head的第i个位置。 { SNODE*p,*q,*newsnode; intm=0;//用来统计学生位置 if(i<1) return0;//插入位置检验,如果错误就返回0退出程序 newsnode=(SNODE*)malloc(sizeof(SNODE));//产生新结点 printf("pleaseinputthenewstudent'sinformation: \n"); printf("num=");scanf("%d",&newsnode->data.num); printf("name=");scanf("%s",newsnode->data.name); printf("wuli=");scanf("%f",&newsnode->data.wuli); printf("shuxue=");scanf("%f",&newsnode->data.shuxue); printf("yingyu=");scanf("%f",&newsnode->data.yingyu); p=*Li_head,q=NULL;//查找第i个结点,使p指向,q指向第i-1个结点 while(p! =NULL) { m++; if() break; else { } } if()//插入在表头 { newsnode->link=p; *Li_head=newsnode; } else//插入在q和p之间 { } return1; } 4、删除一个学生信息 intlistdel(SNODE**Li_head,inti) //删除链表Li_head中第一个元素值为b的结点 { intm=0; SNODE*p,*q; p=*Li_head;q=NULL; if(i<1||*Li_head==NULL)//单链表为空及插入位置校验,如果错误就退出程序 return0; while(p! =NULL) { m++; if(i==m) break; else { q=p;p=p->link; } } if(p==NULL)//i位置结点没有(超过最后一个结点) return0; if(p==*Li_head)//删除表头结点 else//删除非表头结点 //释放该结点所占的空间 return1; } 5、显示所有学生信息 voidlistdisplay(SNODE*Li_head) { printf("班级学生信息如下: \n"); while() { printf("%10d[学号]%10s[姓名]%10.2f[物理成绩]%10.2f[数学成绩]%10.2f[英语成绩]\n",Li_head->data.num,Li_head->data.name,Li_head->data.wuli,Li_head->data.shuxue,Li_head->data.yingyu); Li_head=Li_head->link; } } 6、编写主函数main,要求测试以上所编写的listcreat、listinsert、listdel和listdisplay voidmain()//自己设计主函数完成 { } 【实验小结】(总结本次实验的重难点及心得、体会、收获) 得分_____________ 评阅日期_____________ 教师签名____________ 实验二堆栈或队列基本操作的编程实现 【实验目的】 堆栈和队列基本操作的编程实现 要求: 堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。 也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数: 2H) 【实验内容】 内容: 把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。 可以实验一的结果自己实现数据输入、数据显示的函数。 利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。 【思考问题】 1.栈的顺序存储和链表存储的差异? 2.还会有数据移动吗? 为什么? 3.栈的主要特点是什么? 队列呢? 4.栈的主要功能是什么? 队列呢? 5.为什么会有环状队列? 【参考代码】 (一)利用顺序栈实现十进制整数转换转换成n进制 1、算法思想 将十进制数N转换为r进制的数,其转换方法利用辗转相除法,以N=3456,r=8为例转换方法如下: NN/8(整除)N%8(求余) 34564320低 432540 5466 606高 所以: (3456)10=(6600)8 我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。 算法思想如下: 当N>0时重复1,2 1.若N≠0,则将N%r压入栈s中,执行2;若N=0,将栈s的内容依次出栈,算法结束。 2.用N/r代替N 2、转换子程序 #defineL_size//根据需要自己定义L_size为顺序栈的最大存储容量 voidconversion(intN,intr)//将十进制数N转换为r进制的数 { ints[L_size],top;//定义一个顺序栈,top为栈顶指针,注意此处没有使用结构体类型 intx; //初始化栈 while()//此循环为入栈操作 { //余数入栈 N=N/r;//商作为被除数继续 } while()//此循环为出栈操作 { printf(“%d”,x); } } 3、编写主函数验证上述转换子函数是否正确。 voidmain()//自己设计主函数完成 { } (二)用顺序栈实现算术后缀表达式求值 1、算法思想 后缀表达式求值步骤: a、循环读出后缀表达式中的每一个字符; b、若是数字,将对应的字符串转换成整数,入栈; c、若是运算符,从栈中弹出2个数,将运算结果再压入栈; d、若表达式输入完毕,栈顶即表达式值; 2、后缀表达式求值子程序 #defineL_size50 voidpostexp() { intst[L_size],top=-1;//定义一个顺序栈,top为栈顶指针 intd;//定义用来字符串转换整数的变量d charch; printf("请输入规范的后缀表达式(操作数、运算符之间使用空格间隔开,eg: 1560422/-3*+): \n");//输入范例 while((ch=getchar())! ='\n')//开始输入字符并赋给ch { if(ch=='')//如果输入的是空格,不做处理 else switch(ch)//判断输入是否运算符,如果时就进行相应的操作 { case'+': ;;break; case'-': ;;break; case'*': ;;break; case'/': if(st[top]! =0) { //分母不为零计算才有效 } else { printf("除数为0! \n");//分母为零计算无效,退出程序 exit (1); } break; default: while(ch>='0'&&ch<='9') { ch=getchar(); } //将转换后的数值入栈 } } printf("运算结果是: %d\n",st[top]); } 3、编写主函数验证上述求值子函数是否正确。 voidmain()//自己设计主函数完成 { } (三)链式队列基本操作 1、队列结点定义 根据实际处理数据的类型定义链队中结点的值域类型ElemType typedefstructnode//队列结点类型定义 {ElemTypedata;//队列的数据元素类型 structnode*link;//指向后继结点的指针 }NODE; structQueueLk{//定义链队 //定义链队队头和队尾指针 } 2、入队 NODE*ldcr(structQueueLk*QL,Elemtypex)//将元素x插入到链队列rear中,作为rear的新队尾 { NODE*p; p->data=x; p->link=NULL;//置新结点的指针为空 if(QL->front==NULL)//队列为空 else //将链队列中最后一个结点的指针指向新结点 //将队尾指向新结点 returnQL->rear; } 3、出队 ElemTypeldsc(structQueueLk*QL)//若链队列不为空,则删除队头元素,返回其元素值 {NODE*s; ElemTypex; if()//队空,退出程序 exit (1); s=QL->front;//取队头保存在s中 //删除队头结点 if()//如果删除后队列为空,则处理队尾指针 QL->rear=QL->front; x=s->data;//将刚才出队的结点值给x //释放出对结点的空间 returnx; } 4、编写主函数验证上述子函数是否正确。 voidmain()//自己设计主函数完成 { } 【实验小结】(总结本次实验的重难点及心得、体会、收获) 得分_____________ 评阅日期_____________ 教师签名____________ 实验三串基本操作的编程实现 【实验目的】 内容: 串基本操作的编程实现 要求: 串基本操作的编程实现(2学时,验证型),掌握串的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、合并、剪裁等操作,存储结构可以在顺序结构或链接结构、索引结构中任选,也可以全部实现。 也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数: 2H) 【实验内容】 字符串长度计算,字符串的替换。 【思考问题】 1.字符串的顺序存储和链表存储的差异? C语言中是如何实现字符串的? 2.在字符串处理方面主要有什么操作? 3.字符串的操作的主要特点是什么? 4.举出几个字符串的应用范例? 【参考代码】 (一)字符串长度计算 intStrlen(char*s) { inti; for(i=0;s[i]! ='\0';)/*用循环来计算字符串长度*/ i++; returni;/*将累加的i值返回给Strlen()*/ } /*主程序: 读取字符串长度后,输出该字符串的长度*/ voidmain() { charstring[50];/*声明长度为50的字符串数组*/ intlength;/*字符串长度*/ printf("\nPleaseinputstring: "); gets(string);/*读取字符串存到变量string*/ length=Strlen(string);/*计算字符串string的长度*/ printf("\nTheinputstringlengthis%d",length); } /*希望的结果*/ /*Pleaseinputstring: Howareyou? */ /*Theinputstringlengthis12*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 129606229444843750数据结构实验指导书 最新版 129606229444843750 实验 指导书