1、数据结构课程实验教学手册姓 名: 王俊东 学 号: 1101120216 专 业: 计算机科学与技术 班 级: 2012 级 2 班任课教师: 王爽 时 间: 2013-2014 年度第 1 学期综合成绩: 许昌学院计算机科学与技术学院数据结构课程实验教学手册计算机科学与技术学院数据结构课程组实验手册使用及要求实验操作是教学过程中理论联系实际的重要环节,而实验报告的撰写又是知识系统化的吸收和升华过程,因此,实验报告应该体现完整性、规范性、正确性、有效性。 现将实验报告撰写的有关内容说明如下:1、实验预习报告必须在实验前完成。2、实验时带好实验手册方可进行实验。3、实验时按实验预习报告内容进行实
2、验。并如实填写实验过程及实验小结。 4、实验结束后填写通过后的源程序。通过后的源程序可以手写也可以打印粘贴。实验情况一览表实验序号 实验名称 实验性质 学时实验一 顺序表及其应用 验证性实验 2实验二 单链表及其应用 综合性试验 4实验三 线性表综合练习 设计性试验 6实验四 栈和队列及其应用 设计性试验 4实验五 二叉树及其应用 设计性试验 6实验六 图及其应用 设计性试验 6实验七 查找 设计性试验 4实验八 排序 设计性试验 4许昌学院计算机科学与技术学院数据结构课程实验教学手册实验一实验名称 顺序表及其应用 实验性质 验证性 实验学时数 2 学时 一、实验目的1深入了解线性表的顺序存储
3、结构。2熟练掌握在顺序存储结构上进行插入、删除等操作的算法。3通过线性表结构解决现实中的一些问题。二、实验内容 1. 线性表的顺序存储结构。2. 顺序存储结构上进行插入、删除等操作的算法。3. 通过线性表结构解决现实中的一些问题。三、实验过程1、实验题目问题描述设计一个顺序表,要求:(1)包含不少于 5 个元素,并在屏幕上显示。(2)对建好的顺序表实现查找、插入、删除等操作,并程序执行结果显示到屏幕上。(3)设计一个选择菜单。基本要求(1)按实验内容编写完整的程序,并上机验证。(2)实验完成后,提交电子档教师验收程序,并提交填写好的实验报告。测试数据由学生依据软件工程的测试技术自己确定。注意测
4、试边界数据。2、源程序#include“stdio.h“#include“malloc.h“#define MAXSIZE 200 /线性表允许的最大长度#define datatype inttypedef struct /定义线性表的结构datatype dataMAXSIZE;/表示线性表(a1,a2,,an )int last;/last 表示线性表的实际长度SeqList;void init_SeqList(SeqList *L)/线性表初始化L-last=-1;许昌学院计算机科学与技术学院数据结构课程实验教学手册int insert_SeqList(SeqList *L,int i
5、, datatype x)/插入操作int j;if(iL-last+2)printf(“插入位置不合法!“);return 0;if(L-last=MAXSIZE-1)printf(“表已满无法插入!“);return 0;for(j=L-last;j=i-1;j-)L-dataj+1=L-dataj;L-datai-1=x;L-last+;printf(“插入成功n“); int Delete_SeqList(SeqList *L,int i)/删除操作int k;if(iL-last+1)printf(“删除位置不合法!“);return 0; for(k=i;klast;k+)L-da
6、tak-1=L-datak;L-last-;printf(“删除成功!n“);int Location_SeqList(SeqList *L, datatype x) /按值查找int i,index;for(i=0;ilast;i+)if(L-datai=x)index=i;return (index+1);void print(SeqList *L) /打印线性表int i;printf(“该线性表为:“);许昌学院计算机科学与技术学院数据结构课程实验教学手册for(i=0;ilast;i+)printf(“%4d“,L-datai);printf(“n“);int main() /主函数
7、 void main()SeqList L;int i,choice;init_SeqList(printf(“请输入线性表的长度:“);scanf(“%d“,printf(“请输入线性表的元素:“);for(i=0;idata=c;r-next=s;r=s;else flag=0;r-next=NULL;char get(linklist L,int i) int j;Node *p;if(inext!=NULL)j+;if(i=j)return p-data;else return 0;int inslist(linklist L,int i, char x) Node *pre,*s;i
8、nt k;if(inext;k=k+1;if(! pre)printf(“插入位置不合法!n“); return 0; elses=(Node*)malloc(sizeof(Node);s-data=x;s-next=pre-next;pre-next=s; int deilist(linklist L,int i)Node *pre,*r;int k;pre=L;k=0;许昌学院计算机科学与技术学院数据结构课程实验教学手册while(pre-next!=NULLk=k+1;if(!(pre-next) printf(“删除的节点位置不合法!n“);return 0; r=pre-next;p
9、re-next=r-next;free(r); return 1;void alterlist(linklist L, int i,char x) int j;linklist p;p=L;j=0;if(inext!=NULL)j+;p-data=x;printf(“修改成功!n“);void print(linklist L) linklist p;p=L-next;while(p) printf(“%c “,p-data);p=p-next;printf(“n“);int main() linklist L;int i,choice,x,j;createfromtail(L);doprin
10、tf(“请选择您想要对线性表的操作: 1:插入 2:删除 3:查找 4:修改 5:打印 0:退出n“);scanf(“%d“,switch(choice)case 1:char c; printf(“请输入要插入的字符的位置:“);scanf(“%d“,printf(“请输入要插入的字符:“);许昌学院计算机科学与技术学院数据结构课程实验教学手册c=getchar();c=getchar();inslist(L,j, c);printf(“插入字符后的线性表为:“);print(L); break; case 2:int m;printf(“请输入要删除的字符的位置:“);scanf(“%d“
11、,deilist(L,m);printf(“删除字符后的线性表为:“);print(L); break; case 3:int n;printf(“请输入要查找的字符的位置:“);scanf(“%d“,printf(“您要查找的字符为%c.n“,get(L,n); break; case 4:int a;char x;printf(“请输入要修改的字符的位置:“);scanf(“%d“,printf(“请输入要修改的字符:“);x=getchar();x=getchar();alterlist(L,a,x);printf(“修改字符后的线性表为:“);print(L); break;case
12、5:print(L);case 0:break;default:printf(“请选择正确的操作!n“);break; while(choice!=0);printf(“谢谢使用!n“);return 0;许昌学院计算机科学与技术学院数据结构课程实验教学手册四实验小结初步了解线性表的链式存储结构,及其定义格式。掌握了在链表上进行插入、删除等操作的算法。对链表的了解不是很深入,在其使用上往往会犯一些错误比如在链表中进行插入插不到指定位置,删除时位置错误等。五成绩许昌学院计算机科学与技术学院数据结构课程实验教学手册实验三实验名称 线性表综合练习 实验性质 设计性 实验学时数 6 学时 一、实验目的
13、1根据实际问题,应用线性表的顺序存储结构。2根据实际问题,深入理解线性表的链式存储结构。3通过线性表结构解决现实中的一些问题。二、实验内容 1. 线性表的两种存储结构。2. 不同存储结构上进行插入、删除等操作的算法。3. 通过线性表结构解决现实中的一些问题。三、实验过程1、实验题目问题描述设计一个学生信息系统,要求:(1)每条信息包含学号,姓名,性别,院系,宿舍等项。(2)能够对数据信息进行查找,插入,删除等。(3)选择合适的存储结构,在主程序上运行,验证其正确性,并写出程序执行结果。基本要求(1)按实验内容编写完整的程序,并上机验证。(2)实验完成后,提交电子档教师验收程序,并提交填写好的实
14、验报告。测试数据由学生依据软件工程的测试技术自己确定。注意测试边界数据。2、源程序# include“stdio.h“# include“string.h“# include“stdlib.h“ #include“malloc.h“ typedef struct Nodechar number10;char name10;char sex4;char department16;char dorm6;struct Node* next;Node,*linklist;void createfromtail(linklist L)许昌学院计算机科学与技术学院数据结构课程实验教学手册int i,n;p
15、rintf(“请输入学生数:“);scanf(“%d“, char number10,name10,sex4,department16,dorm6;Node *r,*s;r=L;printf(“请输入学生的信息!n“);for(i=0;inumber,number);strcpy(s-name,name);strcpy(s-sex,sex);strcpy(s-department,department);strcpy(s-dorm,dorm);r-next=s;r=s;r-next=NULL;int inslist(linklist L)char number10,name10,sex4,de
16、partment16,dorm6;Node *pre,*s;int k,i;printf(“请输入插入位置“); scanf(“%d“, if(inext;k=k+1;if(! pre)printf(“插入位置不合法!n“); return 0; elseprintf(“请输入学生学号:“);scanf(“%s“,number);printf(“请输入学生姓名:“);scanf(“%s“,name);printf(“请输入学生性别:“);scanf(“%s“,sex);printf(“请输入学生院系:“);scanf(“%s“,department);printf(“请输入学生宿舍号:“);s
17、canf(“%s“,dorm);s=(Node*)malloc(sizeof(Node);strcpy(s-number,number);strcpy(s-name,name);strcpy(s-sex,sex);strcpy(s-department,department);strcpy(s-dorm,dorm);s-next=pre-next;pre-next=s;int get(linklist L,int i)char number10,name10,sex4,department16,dorm6;int j;Node *p;if(inext!=NULL)j+;if(i=j)许昌学院计
18、算机科学与技术学院数据结构课程实验教学手册printf(“该学生的信息为:n“);printf(“学号:%s “,p-number);printf(“姓名:%s “,p-name);printf(“性别:%s “,p-sex);printf(“学院:%s “,p-department);printf(“宿舍号:%s“,p-dorm);printf(“n“); else return 0;int deilist(linklist L)Node *pre,*r;int k,i;printf(“请输入要删除的字符的位置:“);scanf(“%d“,pre=L;k=0;while(pre-next!=
19、NULLk=k+1;if(!(pre-next)printf(“删除的节点位置不合法!n“);return 0; r=pre-next;pre-next=r-next;free(r); return 1;void print(linklist L) linklist p;p=L-next;while(p)printf(“学号:%s “,p-number);printf(“姓名:%s “,p-name);printf(“性别:%s “,p-sex);printf(“学院:%s “,p-department);printf(“宿舍号:%s“,p-dorm);许昌学院计算机科学与技术学院数据结构课程
20、实验教学手册printf(“n“);p=p-next;int main() linklist L;int i,choice,x,j;createfromtail(L);doprintf(“请选择您想要对线性表的操作: 1:插入 2:删除 3:查找 4:打印 0:退出n“);scanf(“%d“,switch(choice)case 1:inslist(L);print(L); break; case 2:deilist(L);print(L); break; 许昌学院计算机科学与技术学院数据结构课程实验教学手册case 3:int n;printf(“请输入要查找的学生的位置:“);scanf
21、(“%d“,get(L,n); break; case 4:print(L);break;case 0:break;default:printf(“请选择正确的操作!n“);break; while(choice!=0);printf(“谢谢使用!n“);return 0;许昌学院计算机科学与技术学院数据结构课程实验教学手册四实验小结对链式表有了进一步的了解,能够利用链式表解决一些实际问题。了解了链式表的优势,他不会造成空间的浪费,对于插入和删除操作上链式表比顺序表有明显的优势。五成许昌学院计算机科学与技术学院数据结构课程实验教学手册绩实验四实验名称 栈和队列及其应用 实验性质 设计性 实验学
22、时数 4 学时 一、实验目的1掌握栈与队列的抽象数据类型描述及特点。2掌握栈和队列的顺序和链式存储结构与基本算法实现。3掌握栈和队列在实际问题中的应用和基本编程技巧。二、实验内容 1. 栈和队列在不同存储结构上进行插入、删除等操作的算法。2. 通过栈或队列解决现实中的一些问题。1、实验题目问题描述以下题目根据自己兴趣和能力可选作一道作为实验题目:(1)根据栈的数据结构,建立一个顺序栈和链栈并实现对其基本操作;(2)根据队列的数据结构,建立一个循环队列和链队并实现对其基本操作;(3)根据教材 3.4.3 节介绍的思想,设计并实现一个对简化表达式求值的系统(4)银行业务队列简单模拟。设某银行有 A
23、、B 两个业务窗口,其中 A 窗口的处理速度是 B 窗口的 2 倍,给定到达银行的顾客序号,请按业务完成的顺序输出顾客序列(假设奇数编号到 A 窗口办理,偶数编号到 B 窗口办理,不同窗口同时处理完 2 个顾客,A 窗口优先输出) 。基本要求(1)按实验内容编写完整的程序,并上机验证。(2)实验完成后,提交电子档教师验收程序,并提交填写好的实验报告。测试数据由学生依据软件工程的测试技术自己确定。注意测试边界数据。许昌学院计算机科学与技术学院数据结构课程实验教学手册许昌学院计算机科学与技术学院数据结构课程实验教学手册三实验过程2、源程序# include“stdio.h“# include“st
24、dlib.h“typedef structint elem50;int top;Seqstack;typedef struct node int data;struct node *next;linkstacknode;typedef linkstacknode *linkstack;void initstack(Seqstack *s) s-top=-1; int push(Seqstack *s ,int x) if(s-top=49)printf(“栈已满!n“);return 0;s-top+;s-elems-top=x;return 1;void pop(Seqstack *s) i
25、nt x;if(s-top=-1)printf(“栈为空!n“);elsex=s-elems-top;s-top-;printf(“出栈元素为:%d.n“,x);许昌学院计算机科学与技术学院数据结构课程实验教学手册void print(Seqstack s) int i;if(s.top=-1)printf(“栈为空!n“);elseprintf(“栈里的元素为:“);do printf(“%4d “,s.elems.top);s.top-;while(s.top!=-1);printf(“n“);void initlinstack(linkstack top)top-next=NULL;in
26、t Push(linkstack top,int x) linkstacknode *temp;temp=(linkstacknode *)malloc(sizeof(linkstacknode);if(temp=NULL)return 0;elsetemp-data=x;temp-next=top-next;top-next=temp;return 1; int Pop(linkstack top) int x;linkstacknode *temp;temp=top-next;if(temp=NULL) printf(“栈已空!n“);return 0;else许昌学院计算机科学与技术学院
27、数据结构课程实验教学手册x=temp-data;top-next=temp-next;free (temp);return x;void Print(linkstack s) printf(“栈里的元素为:“); while(s-next!=NULL)printf(“%4d“,Pop(s);printf(“n“);int main()int choice,choice1,choice2,x1,x2,y;Seqstack s1;linkstacknode s2;doprintf(“请输入你的选择: (1)对顺序栈操作 (2)对链栈操作 0:退出n“);scanf(“%d“, switch(cho
28、ice) case 1:initstack(doprintf(“请输入你的选择: (1) 入栈 (2)出栈 (3)打印 0:退出n“);scanf(“%d“,switch(choice1)case 1:printf(“请输入入栈元素:“);scanf(“%d“, push(break;case 2:pop(break;case 3:许昌学院计算机科学与技术学院数据结构课程实验教学手册print(s1);break;case 0:break; while(choice1!=0);break;case 2:initlinstack(doprintf(“请输入你的选择: (1) 入栈 (2)出栈 (
29、3)打印 0:退出n“);scanf(“%d“,switch(choice2)case 1:printf(“请输入入栈元素:“);scanf(“%d“, Push(break;case 2:y=Pop(if(y!=0)printf(“出栈元素为:%d.n“,y);break;case 3:Print(break;case 0:break; while(choice2!=0);break;case 0:break; while(choice!=0);许昌学院计算机科学与技术学院数据结构课程实验教学手册return 0;四实验总结对栈和队列有了初步的了解,他们都是一种特殊的操作受限制线性表,栈的特
30、点是先进后出而队列的是先进先出。在写程序中出现了一些问题,参数传递不匹配,还有一些错误虽然编译通过了但执行的时候却错误了,后经调试修改得到是参数传递过程中出现了问题。五成绩许昌学院计算机科学与技术学院数据结构课程实验教学手册实验五实验名称 二叉树及其应用 实验性质 设计性 实验学时数 6 学时 一、实验目的1掌握二叉树链表的结构和构造过程。2掌握用递归方法实现二叉树的遍历。3加强对二叉树的理解,培养解决实际问题的能力。二、实验内容 1. 用递归方法实现对二叉树的遍历等操作。2. 二叉树的其他操作算法。三、实验过程1、实验题目问题描述以下题目根据自己兴趣和能力可选作二道作为实验题目:(1)创建一
31、颗二叉树,用递归方法实现对其进行先序、中序和后序遍历的操作;(2)根据题目 1,修改其中一个算法,用来计算统计二叉树中叶子节点的个数和度为 1、度为 2 的节点个数;(3)设计并实现一个哈夫曼树并对其进行编码。(4)修理牧场。农夫要修理牧场的一段栅栏,发现需要 N 块木头,每块木头长度为整数 Li 个长度单位,于是他购买了一条很长的、能锯成 N 块的木头,即该木头的长度是 Li 的总和。但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。简单起见,设酬金等于所锯木头的长度。例如,将长度为 20 的木头锯成长度为 8、7 和 5 的三段,第一次锯木头将木头锯成 12 和 8,花费 20;
32、第二次将木头长度为 12 的木头锯成 7 和 5 花费 12,总花费为 32.如果第一次将木头锯成 15 和 5 ,则第二次锯木头花费 15,总花费 35(大于 32) 。请编写程序帮助农夫计算将木头锯成 N 块的最少花费。输入数据 N 表示要将木头锯成 N 块,然后输入 N 个整数,表示每段木块的长度。输出将木头锯成 N 块的最少花费。 (可采用哈夫曼算法和最小堆实现)基本要求(1)按实验内容编写完整的程序,并上机验证。(2)实验完成后,提交电子档教师验收程序,并提交填写好的实验报告。测试数据由学生依据软件工程的测试技术自己确定。注意测试边界数据。许昌学院计算机科学与技术学院数据结构课程实验
33、教学手册实验过程2、源程序一# include“stdio.h“# include“stdlib.h“typedef struct node char data;struct node*lchild;struct node*rchild;bitnode,*bitree;void inist(bitree *root) (*root)=(bitree)malloc(sizeof(bitnode);(*root)-lchild=NULL;(*root)-rchild=NULL;bitree create(bitree root) char ch;ch=getchar();if(ch!=.) if(
34、root=(bitree)malloc(sizeof(bitnode)!=NULL)root-data=ch;root-lchild=create(root-lchild);root-rchild=create(root-rchild);elseroot=NULL;return root;void preorder(bitree root) if(root!=NULL) printf(“%c“,root-data);preorder(root-lchild);preorder(root-rchild);许昌学院计算机科学与技术学院数据结构课程实验教学手册实验过程void inorder(bit
35、ree root) if(root!=NULL) inorder(root-lchild);printf(“%c“,root-data);inorder(root-rchild);void postorder(bitree root) if(root!=NULL) postorder(root-lchild);postorder(root-rchild);printf(“%c“,root-data);int main()int choice; bitree root;inist(printf(“初始化成功!n“); root=(bitree)malloc(sizeof(bitnode);pri
36、ntf(“请输入字符以.结束:“);root=create(root); doprintf(“请输入你的选择:1 前序遍历 2 中序遍历 3 后序遍历 0 退出n“);scanf(“%d“,switch(choice) case 1:preorder(root);printf(“n“);break;case 2:inorder(root);printf(“n“);break;许昌学院计算机科学与技术学院数据结构课程实验教学手册case 3:postorder(root);printf(“n“);break;case 0:break;default:printf(“输入不合法,请重新输入!n“)
37、;break; while(choice!=0);printf(“谢谢使用!n“);return 0;2# include“stdio.h“# include“stdlib.h“int leafcount=0;int leafcount1=0;int leafcount2=0;typedef struct node char data;struct node*lchild;struct node*rchild;bitnode,*bitree;void inist(bitree *root) (*root)=(bitree)malloc(sizeof(bitnode);(*root)-lchil
38、d=NULL;(*root)-rchild=NULL;许昌学院计算机科学与技术学院数据结构课程实验教学手册bitree create(bitree root) char ch;ch=getchar();if(ch!=.) if(root=(bitree)malloc(sizeof(bitnode)!=NULL)root-data=ch;root-lchild=create(root-lchild);root-rchild=create(root-rchild);elseroot=NULL;return root;void leaf(bitree root) if(root!=NULL) lea
39、f(root-lchild);leaf(root-rchild);if(root-lchild=NULLvoid leaf1(bitree root) if(root!=NULL) leaf1(root-lchild);leaf1(root-rchild);if(root-lchild!=NULLvoid leaf2(bitree root) if(root!=NULL) leaf2(root-lchild);leaf2(root-rchild);if(root-lchild!=NULLint main()int choice; bitree root;inist(printf(“初始化成功!n“);