《数据结构与算法实验》任务书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法实验》任务书
《数据结构与算法实验》任务书
实验一动态链表的设计与应用
一、实验目的、要求
1、掌握使用VC 6.0上机调试线性表的基本方法;
2、掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在顺序存储结构
和链式存储结构上的运算。
二、实验内容
1.输入一组学生信息,建立一个单链表。
2.遍历该链表,输出学生信息。
3.查找某特定的学生,查找成功返回1,否则返回0。
4.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
5.利用算法4建立两个非递减有序单向链表,然后合并成一个非递增链表。
*6.采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。
7.编写一个主函数,调试上述算法。
*8.综合训练:利用链表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等,并能够实现将数据存储到文件中)
三、实验说明
1.存储定义
#define MAXSIZE 100 //表中元素的最大个数
typedef int ElemType;//元素类型
typedef struct list{
ElemType elem[MAXSIZE];//静态线性表
int length; //表的实际长度
}SqList;//顺序表的类型名
2.建立顺序表时可利用随机函数自动产生数据。
四、注意问题
1.插入、删除时元素的移动原因、方向及先后顺序。
2.了解不同的函数形参与实参的传递关系。
一、实验目的、要求
1.掌握栈、队列的思想及其存储实现。
2.掌握栈、队列的常见算法的程序实现。
二、实验内容
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
*6.综合训练:1)利用栈实现表达式求值算法。
2)利用栈实现迷宫求解。
三、实验说明
1.基本要求:实现算法1、3或算法2、4即可。
2.类型定义
顺序栈示例
#define MAX 100 //栈的最大值
typedef struct
{ElemType *base;
int top;
}SqStack;
顺序队列示例
#define MAX 100 //队列的最大长度
typedef struct
{ElemType *base;
int front,rear;
}SqQueue;
3.算法6的每个子功能尽可能写成函数形式。
四、注意问题
1.重点理解栈、队列的算法思想,能够根据实际情况选择合适的存储结构。
2.注意算法6的各个函数之间值的传递情况。
3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。
一、实验目的、要求
1.进一步掌握指针变量的含义。
2.掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3.掌握用指针类型描述、访问和处理二叉树的运算。
4.掌握二叉树的存储实现。
5.掌握二叉树的遍历思想。
6.掌握二叉树的常见算法的程序实现。
二、实验内容
1.输入字符序列,建立二叉树。
2.中序遍历二叉树:递归算法。
3.中序遍历二叉树:非递归算法。
(最好也能实现先序,后序非递归算法) 4.求二叉树的高度。
5.求二叉树的叶子个数。
*6.将二叉链表视为森林的孩子兄弟链表,计算森林中叶子个数。
*7.建立中序线索二叉树,并实现中序遍历。
8.借助队列实现二叉树的层次遍历。
9.在主函数中设计一个简单的菜单,分别调试上述算法。
三、实验说明
1.类型定义 //二叉链表存储
#define ElemType char//元素类型
typedef struct BiTNode
{ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
2.元素类型可以根据实际情况选取。
四、注意问题
1.注意理解递归算法的执行步骤。
2.注意字符类型数据在输入时的处理。
3.重点理解如何利用栈结构实现非递归算法。
实验四赫夫曼编码与压缩
一、实验目的、要求
熟练掌握二叉树应用(Huffman编码)的基本算法实现
二、实验内容
1. 统计字符串中字符的种类以及各类字符的个数的函数
2. 实现构造Huffman树的函数
3. 实现Huffman编码的函数
4. 建立正文的编码文件的函数
5.代码文件的译码函数
6.在主函数中设计一个简单的菜单,分别调试上述算法。
7.综合训练:输入一段文本, 统计其中字符出现频率, 设计实现相应的Huffman树和Huffman码, 并完成对该段文本的编码与译码。
三、实验说明
typedef struct {
int weight; //权值
int lchild , rchild , parent; //左右孩子及双亲指针
}HTNode; //树中结点类型
typedef HTNode HuffmanTree[m+1]; //0号单元不用
实验五最短路径算法的实现与应用
一、实验目的、要求
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3.掌握图的常见应用算法的思想及其程序实现。
二、实验内容
1.键盘输入数据,建立一个有向图的邻接表。
2.输出该邻接表。
3.以有向图的邻接表为基础实现输出它的拓扑排序序列。
4.采用邻接表存储实现无向图的深度优先非递归遍历。
5.采用邻接表存储实现无向图的广度优先遍历。
6.采用邻接矩阵存储实现无向图的最小生成树的PRIM算法。
7.在主函数中设计一个简单的菜单,分别调试上述算法。
8.综合训练:以全国主要城市为图的顶点, 铁路连接为图的边, 距离作为加权, 设计完成一个最短路径自动查找系统. 输入为出发城市和目标城市, 输出为最短路径和距离。
进阶:加入中国地图作为背景,出发城市和目标城市采用鼠标点击输入。
三、实验说明
1.类型定义(邻接表存储)
#define MAX_VERTEX_NUM 8 //顶点最大个数
typedef struct ArcNode
{int adjvex;
struct ArcNode *nextarc;
int weight; //边的权
}ArcNode; //表结点
#define VertexType int //顶点元素类型
typedef struct VNode
{int degree,indegree;//顶点的度,入度
VertexType data;
ArcNode *firstarc;
}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;//顶点的实际数,边的实际数
}ALGraph;
2.上述类型定义可以根据实际情况适当调整。
实验六内部排序算法的实现与比较
一、实验目的、要求
1.掌握常见的排序算法的思想及其适用条件。
2.掌握常见的排序算法的程序实现。
二、实验内容
输入一组关键字序列分别实现下列排序:
1.实现简单选择排序、直接插入排序和冒泡排序。
2.实现希尔排序算法。
3.实现快速排序算法。
4.实现堆排序算法。
5.快速排序的非递归算法。
*6.实现折半插入排序。
*7.采用链式存储实现简单选择排序、直接插入排序和冒泡排序。
8.在主函数中设计一个简单的菜单,分别测试上述算法。
9.综合训练:采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。
三、实验说明
1.类型定义
#define MAXSIZE 100 /*参加排序元素的最大个数*/
typedef struct list
{int key;
}RedType;
typedef struct {
RedType r[MAXSIZE+1];
int length; /*参加排序元素的实际个数*/
}SqList;
2.算法5可以借助栈实现。
四、注意问题
1.在RedType中增加一个数据项验证各种排序算法的稳定性。
2.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。
实验七查找算法的实现
一、实验目的、要求
1.掌握折半查找算法的思想及程序实现。
2.掌握二叉排序树、B树的查找、插入、删除、建立算法的思想及程序实现。
3.掌握散列存储结构的思想,实现不同冲突处理方法的散列表的查找、建立。
二、实验内容
1.利用实验一建立有序表,采用折半查找实现某一已知的关键字的查找。
2.随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后删除某一指定关键字元素。
3.建立B树并实现删除某一指定关键字元素。
4.已知散列函数为H(key)=key%p(p为自定的常数),冲突处理方法分别为线性探测法、外拉链法实现散列表的建立(利用插入算法实现)。
三、实验说明
1.存储定义(散列表的外拉链法)
#define n 9
typedef struct node
{int key;
struct node *next;
}NODE;
NODE *HashTable[9];
算法1、2、3可以参考顺序表,二叉链表的存储实现。
2.各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。
四、注意问题
1.注意理解折半查找的适用条件(链表能否实现折半查找?)。
2.注意建立二叉排序树、散列表时相同元素的处理。
3.注意理解静态查找、动态查找概念。
4.比较各种查找算法的各自特点,能够根据实际情况选择合适的查找方法。