数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
《数据结构》实验指导书
计算机专业实验中心编
2020年7月29日
《数据结构》上机实验内容和要求
通过上机实验加深对课程内容的理解,增加感性认识,提高程序设计、开发及调试能力。
序号
实验
名称
内容
提要
每组
人数
实验
时数
实验
要求
实验
类别
分值(总100分)
1
顺序表的实现及应用
掌握顺序表结构,实现其插入、删除等算法。
利用顺序表将两个有序线性表合并为一个有序表。
1
2
必做
设计
10分
2
链表的实现及应用
掌握单链表结构,实现其插入、删除、查找等算法。
利用单链表将两个有序链表合并为一个有序链表。
1
2
必做
设计
10分
3
栈的实现及应用
掌握栈的结构,将栈应用于表达式计算问题
1
2
必做
设计
15分
4
队列的实现及应用
掌握队列的结构,将队列应用于模拟服务台前的排队现象问题
1
2
必做
设计
15分
5
二叉树操作及应用
掌握二叉树的存储,实现三种遍历的递归算法、实现前序或中序的非递归遍历算法
1
2
必做
设计
15分
6
图的遍历操作及应用
实现图的存储、深度遍历和广度遍历算法
1
2
必做
设计
10分
7
查找算法的实现
实现顺序表的二分查找算法
1
2
必做
设计
10分
8
排序算法的实现
实现直接插入排序、快速排序等算法
1
2
必做
设计
15分
本实验指导书适用于16学时《数据结构》实验课,实验项目具体内容如下:
实验报告要求
请按照实验教师要求,按时提交实验报告电子版文件。
实验报告格式可个性化定义,内容包括但不限于以下内容:
1、题目、姓名、学号、班级(首页)
2、需求分析:
陈述程序设计的任务,强调程序要做什么,明确规定:
(1)输入的形式和输出值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入输出结果和错误的输入及输出结果。
3、概要设计:
说明用到的数据结构定义、主程序的流程及各程序模块之间的调用关系。
4、详细设计:
提交带注释的源程序或者用伪代码写出每个操作所涉及的算法。
5、调试分析:
(1)调试过程中所遇到的问题及解决方法;
(2)算法的时空分析;
(3)经验与体会。
6、用户使用说明:
说明如何使用你设计的程序,详细列出每一步操作步骤。
(如果程序操作简单,可略去)
7、测试结果:
列出对于给定的输入所产生的输出结果。
(若有可能,测试随输入规模的增长所用算法的实际运行时间的变化)
8、总结
实验一、顺序表的实现及应用
一、实验目的
了解和掌握线性表的顺序存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。
二、实验要求
给定一段程序代码,程序代码所完成的功能为:
(1)建立一个线性表;
(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。
假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用顺序表。
程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,修改后上机调试得到正确的运行结果。
三、程序代码
#include<>
#defineMaxSize100
typedefintDataType;
typedefstruct
{
DataTypelist[MaxSize];
intsize;
}SeqList;
voidListInitiate(SeqList*L)/*初始化顺序表L*/
{
L->size=0;/*定义初始数据元素个数*/
}
intListLength(SeqListL)/*返回顺序表L的当前数据元素个数*/
{
return;
}
intListInsert(SeqList*L,inti,DataTypex)
/*在顺序表L的位置i(0≤i≤size)前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
{
intj;
if(L->size>=MaxSize)
{
printf("顺序表已满无法插入!
\n");
return0;
}
elseif(i<0||i>L->size)
{
printf("参数i不合法!
\n");
return0;
}
else
{正上述程序中的错误(必作)。
2.编写合并函数,将两个有序线性表合并为一个有序表并在主函数中加以测试(选作)。
3.完成实验报告的撰写。
实验二、链表的实现及应用
一、实验目的
了解和掌握线性表的链式存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。
二、实验要求
给定一段程序代码,程序代码所完成的功能为:
(1)建立一个线性表;
(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。
假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用单链表。
程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,上机调试并得到正确的运行结果。
三、程序代码:
#include<>/*该文件包含pringtf()等函数*/
#include<>/*该文件包含exit()等函数*/
#include<>/*该文件包含malloc()等函数*/
typedefintDataType;/*定义DataType为int*/
typedefstructNode
{
DataTypedata;
structNode*next;
}SLNode;
voidListInitiate(SLNode**head)/*初始化*/
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
(*head)->next=NULL;/*置链尾标记NULL*/
}
intListLength(SLNode*head)/*单链表的长度*/
{
SLNode*p=head;/*p指向首元结点*/
intsize=0;/*size初始为0*/
while(p->next!
=NULL)/*循环计数*/
{
p=p->next;
size++;
}
returnsize;
}
intListInsert(SLNode*head,inti,DataTypex)
/*在带头结点的单链表head的数据元素ai(0≤i≤size)结点前*/
/*插入一个存放数据元素x的结点*/
{
SLNode*p,*q;
intj;
p=head;/*p指向首元结点*/
j=-1;/*j初始为-1*/
while(p->next!
=NULL&&j/*最终让指针p指向数据元素ai-1结点*/
{
p=p->next;
j++;
}
if(j!
=i-1)
{
printf("插入位置参数错!
");
return0;
}
/*生成新结点由指针q指示*/
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
q->data=x;
正上述程序中的错误(必作)。
2.编写合并函数,将两个有序的单链表合并成一个有序单链表(选作)。
3.完成实验报告的撰写。
实验三、栈的实现及应用
一、实验目的
1.掌握栈的存储表示和实现
2.掌握栈的基本操作实现。
3.掌握栈在解决实际问题中的应用。
二、实验要求
问题描述:
编写程序实现算术表达式的求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。
主要功能描述如下:
1、从键盘上输入表达式。
2、分析该表达式是否合法。
3、若上述处理过程中没有发现错误,则认为该表达式合法,计算并打印处理结果。
三、主要功能函数参考
程序中主要包含下面几个功能函数:
voidinitstack():
初始化堆栈
intMake_str():
语法检查
intpush_operate(intoperate):
将操作码压入堆栈
intpush_num(doublenum):
将操作数压入堆栈
intprocede(intoperate):
处理操作码
intchange_opnd(intoperate):
将字符型操作码转换成优先级
intpush_opnd(intoperate):
将操作码压入堆栈
intpop_opnd():
将操作码弹出堆栈
intcaculate(intcur_opnd):
简单计算+,-,*,/
doublepop_num():
弹出操作数
四、实验任务
认真阅读与理解实验内容的具体要求,参考教材相关章节,结合实验内容的要求,编写实验程序并上机调试与测试,完成实验报告的撰写。
实验四、队列的实现及应用
一、实验目的
1.掌握队列的存储表示和实现。
2.掌握队列的基本操作实现。
3.掌握队列在解决实际问题中的应用。
二、实验要求
利用队列模拟服务台前的排队现象问题。
问题描述:
某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围的随机值。
设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。
假定模拟数据已按客户到达的先后顺序依次存于某个文本数据文件中,对应每位客户有两个数据:
到达时间和需要办理业务的时间。
三、实验任务
认真阅读与理解实验内容的具体要求,参考教材相关章节,结合实验内容的要求,编写实验程序并上机调试与测试,完成实验报告的撰写。
实验五、二叉树操作及应用
一、实验目的
掌握二叉树的定义、结构特征,以及各种存储结构的特点及使用范围,各种遍历算法。
掌握用指针类型描述、访问和处理二叉树的运算。
掌握前序或中序的非递归遍历算法。
二、实验要求
有如下二叉树:
程序代码给出了该二叉树的链式存储结构的建立、前序、中序、后序遍历的算法,同时也给出了查询“E”是否在二叉树里的代码。
代码有三处错误,有标识,属于逻辑错误,对照书中的代码仔细分析后,请修改了在电脑里运行。
#include<>
#include<>
typedefcharDataType;
typedefstructNode
{
DataTypedata;/*数据域*/
structNode*leftChild;/*左子树指针*/
structNode*rightChild;/*右子树指针*/
}BiTreeNode;/*结点的结构体定义*/
/*初始化创建二叉树的头结点*/
voidInitiate(BiTreeNode**root)
{
*root=(BiTreeNode*)malloc(sizeof(BiTreeNode));
(*root)->leftChild=NULL;
(*root)->rightChild=NULL;
}
voidDestroy(BiTreeNode**root)
{
if((*root)!
=NULL&&(*root)->leftChild!
=NULL)
Destroy(&(*root)->leftChild);
if((*root)!
=NULL&&(*root)->rightChild!
=NULL)
Destroy(&(*root)->rightChild);
free(*root);
}
/*若当前结点curr非空,在curr的左子树插入元素值为x的新结点*/
/*原curr所指结点的左子树成为新插入结点的左子树*/
/*若插入成功返回新插入结点的指针,否则返回空指针*/
BiTreeNode*InsertLeftNode(BiTreeNode*curr,DataTypex)
{
BiTreeNode*s,*t;
if(curr==NULL)returnNULL;
t=curr->leftChild;/*保存原curr所指结点的左子树指针*/
s=(BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data=x;
s->leftChild=t;/*新插入结点的左子树为原curr的左子树*/
s->rightChild=NULL;
curr->leftChild=s;/*新结点成为curr的左子树*/
returncurr->leftChild;/*返回新插入结点的指针*/
}
/*若当前结点curr非空,在curr的右子树插入元素值为x的新结点*/
/*原curr所指结点的右子树成为新插入结点的右子树*/
/*若插入成功返回新插入结点的指针,否则返回空指针*/
BiTreeNode*InsertRightNode(BiTreeNode*curr,DataTypex)
{
BiTreeNode*s,*t;
if(curr==NULL)returnNULL;
t=curr->rightChild;/*保存原curr所指结点的右子树指针*/
s=(BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data=x;
s->rightChild=t;/*新插入结点的右子树为原curr的右子树*/
s->leftChild=NULL;
curr->rightChild=s;/*新结点成为curr的右子树*/
returncurr->rightChild;/*返回新插入结点的指针*/
}
voidPreOrder(BiTreeNode*t,voidvisit(DataTypeitem))
正程序错误(必作)。
2.编写二叉树的前序(或中序)的非递归遍历算法并进行测试(选作)。
3.完成实验报告的撰写。
实验六、图的遍历操作及应用
一、实验目的
掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。
三、实验要求
采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。
本实验给出了示例程序,其中共有4处错误,错误段均有标识,属于逻辑错误。
请认真理解程序,修改程序代码,并在电脑上调试运行。
四、DFS和BFS的基本思想
深度优先搜索法DFS的基本思想:
从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,……依次继续。
如果当前被访问过的顶点的所有邻接顶点都已被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W,从W出发按同样方法向前遍历。
直到图中所有的顶点都被访问。
广度优先算法BFS的基本思想:
从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,……,Vt;再依次访问与V1,V2,……,Vt相邻的起且未被访问过的的所有顶点。
如此继续,直到访问完图中的所有顶点。
五、
示例程序
1.邻接矩阵作为存储结构的程序示例
#include""
#include""
#defineMaxVertexNum100ertex=a;irstedge=NULL;irstedge;
G->adjlist[i].firstedge=s;irstedge;
G->adjlist[j].firstedge=s;ertex);irstedge;ertex);irstedge;ertex);n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示:
intSeqSearch(SeqListR,intn,KeyTypek)
{
inti=0;
while(i=k)
{
printf("%d",R[i].key);
i++;
}
if(i>=n)
return-1;
else
{
printf("%d",R[i].key);
returni;
}
}
2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录的位置,失败时返回-1,具体的算法如下:
intBinSearch(SeqListR,intn,KeyTypek)
{
intlow=0,high=n-1,mid,count=0;
while(low<=high)
{
mid=(low+high)/2;
printf("第%d次查找:
在[%d,%d]中找到元素R[%d]:
%d\n",++count,low,high,mid,R[mid].key);
if(R[mid].key==k)
returnmid;
if(R[mid].key>k)
high=mid-1;
else
low=mid+1;
}
return-1;
}
四、实验任务
认真阅读与理解实验内容的具体要求,参考教材相关章节,编写实验程序并上机调试与测试,完成实验报告的撰写。
实验八、排序算法的实现
一、实验目的
1.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;
2.深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;
3.了解各种方法的排序过程及其时间复杂度的分析方法。
二、实验要求
统计成绩:
给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:
(1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
(2)按名次列出每个学生的姓名与分数。
三、实验步骤
1.定义结构体。
Typedefstructstudent
{charname[8];
intscore;}
2.定义结构体数组。
3.编写主程序,对数据进行排序。
4.要求至少采用两种排序算法实现,如直接插入排序、快速排序等算法。
四、实验任务
认真阅读与理解实验内容的具体要求,参考教材相关章节,编写实验程序并上机调试与测试,完成实验报告的撰写。