数据结构试验指导书文档格式.docx
- 文档编号:17627431
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:24
- 大小:27.39KB
数据结构试验指导书文档格式.docx
《数据结构试验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构试验指导书文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
实验七综合实验16
实验八停车场管理18
实验九窗口管理19
实验一线性表的操作
实验类型:
设计性
实验要求:
必修
实验学时:
4学时
一、实验目的:
基于线性表顺序表类和链表类,实现线性表的相关算法。
二、实验要求:
1、掌握线性表顺序表类和链表类的特点。
掌握线性表的常见算法。
2、在评测系统平台提交相应的实验项目,并提交电子版实验报告,报告内容包括:
目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1.设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:
建立一个线性表,首先依次输人数据元素1,2,3,…,10,然后删除数据元素6,最后依次显示当前线性表中的数据元素。
要求采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。
2.设计一个带头结点的单链表类,要求:
(1)生成一个整数线性表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(2)设计一个测试主函数,实际运行验证所设计单链表类的正确性。
3.设计一个不带头结点的单链表类,要求:
(1)不带头结点单链表类的成员函数包括取数据元素个数、插入元素、删除所有值为k的元素、取数据元素。
(提示:
要考虑在第一个数据元素结点前插入和删除第一个数据元素结点时与在其他位置插入和删除其他位置结点时的不同情况。
)
(2)设计一个测试主函数,实际运行验证所设计循环单链表类的正确性。
4.设计一个仅设置尾指针的无头结点的循环单链表类,实现约瑟夫环问题;
问题描述:
设编号为1,2,…,n(n>
0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.如此下去,直到所有人全部出列为止。
要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:
n=7,7个人的密码依次为3,1,7,2,4,8,4初始报数上限值m=20
*5.设计一个带头结点的循环双向链表类,要求:
(1)带头结点循环双向链表类:
获取元素个数、插入、删除、取数据元素等。
(2)设计一个测试主函数,实际运行验证所设计循环双向链表类的正确性。
*6.设计一个单链表实现一元多项式求和问题。
要求:
(1)设计存储结构表示一元多项式;
(2)设计算法实现一元多项式相加。
实验二栈、队列的操作
验证性
2学时
基于栈类和队列类,实现栈和队列的常见算法,并结合线性表类实现有关串的操作。
1、掌握栈、队列、串的特点。
掌握特殊线性表的常见算法。
2、提交实验报告,报告内容包括:
1.堆栈类测试和应用问题。
(1)设计一个主函数实现对顺序堆栈类和链式堆栈类代码进行测试。
测试方法为:
依次把数据元素1,2,3,4,5入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
(2)定义数据元素的数据类型为如下形式的结构体:
structDataType
{chartaskname[10];
//任务名
inttaskno;
//任务号
};
设计一个包含5个数据元素的测试数据,并设计一个主函数实现依次把5个数据元素入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
2.队列类测试和应用问题。
设计一个主函数对循环队列类和链式队列类代码进行测试.测试方法为:
依次把数据元素1,2,3,4,5入队,然后出队中的数据元素并在屏幕上显示。
3.设计串采用顺序存储结构,编写函数实现两个串的比较Compare(S,T)。
要求比较结果有大于、等于和小于三种情况。
*4.设计算法利用栈类实现把十进制整数转换为二至九进制之间的任一进制输出。
*5.设计串采用静态数组存储结构,编写函数实现串的替换Replace(S,start,T,V),即要求在主串S中,从位置start开始查找是否存在子串T,若主串S中存在子串T,则用子串V替换子串T,且函数返回1;
若主串S中不存在子串T,则函数返回0。
并要求设计主函数进行测试。
一个测试例子为:
S=“Iamastudent”,T=“student”,V=“teacher”。
*6.输入一个C++表达式,实现表达式求值算法。
注意问题
1.重点理解栈、队列和串的算法思想,能够根据实际情况选择合适的存储结构。
2.栈、队列的算法是后续实验的基础(树、图、查找、排序等)。
实验三二叉树的操作
2学时
基于教材给定的二叉树类,实现二叉树的有关操作。
1、掌握二叉树、哈夫曼树和树的特点。
掌握它们的常见算法。
1.设计实现二叉树类,要求:
(1)编写一个程序,首先建立不带头结点的二叉链式存储结构的二叉树,然后分别输出按照前序遍历二叉树、中序遍历二叉树和后序遍历二叉树访问各结点的序列信息,最后再测试查找函数和撤销函数的正确性。
(2)实现二叉树层次遍历的非递归算法。
(3)编写一主函数来验证算法实现。
2.假设二叉树采用链式存储结构进行存储,编写一个算法,输出一个二叉树的所有叶子结点,并统计叶子结点个数。
*3.设计实现二叉线索链表类,要求:
(1)编写一个程序,首先建立中序线索链表的二叉树,然后实现中序线索链表的遍历算法。
(2)编写一主函数来验证算法实现。
*4.编写求二叉树高度的函数。
*5.编写创建哈夫曼树和生成哈夫曼编码的算法。
*6.假设二叉树采用链式存储结构进行存储,试设计一个算法,输出从每个叶子结点到根结点的路径。
*7.假设二叉树采用链式存储结构进行存储,试设计一个算法,求二叉树的宽度(即具有结点数最多的层次上结点总数)
四、程序样例
1.二叉树
二叉链表结点声明
template<
classT>
structBiNode
{
Tdata;
BiNode<
T>
*lchild,*rchild;
};
二叉链表类声明
classBiTree
public:
BiTree(){root=NULL;
}//无参构造函数,初始化一棵空的二叉树
BiTree(BiNode<
*root);
//有参构造函数,初始化一棵二叉树,其前序序列由键盘输入
~BiTree();
//析构函数,释放二叉链表中各结点的存储空间
voidPreOrder(BiNode<
//前序遍历二叉树
voidInOrder(BiNode<
//中序遍历二叉树
voidPostOrder(BiNode<
//后序遍历二叉树
voidLeverOrder(BiNode<
//层序遍历二叉树
private:
*root;
//指向根结点的头指针
voidCreat(BiNode<
//有参构造函数调用
voidRelease(BiNode<
//析构函数调用
二叉树的层序遍历算法LeverOrder
voidBiTree:
:
LeverOrder(BiNode<
*root)
front=rear=0;
//采用顺序队列,并假定不会发生上溢
if(root==NULL)return;
Q[++rear]=root;
while(front!
=rear)
q=Q[++front];
cout<
<
q->
data;
if(q->
lchild!
=NULL)Q[++rear]=q->
lchild;
rchild!
rchild;
}
}
二叉树的构造函数算法BiTree
BiTree:
BiTree(BiNode<
creat(root);
voidBiTree:
Creat(BiNode<
cin>
>
ch;
if(ch=='
#'
)root=NULL;
//建立一棵空树
else{
root=newBiNode<
;
//生成一个结点
root->
data=ch;
Creat(root->
lchild);
//递归建立左子树
rchild);
//递归建立右子树
}
二叉树的后序遍历递归算法PostOrder
PostOrder(BiNode<
{
//递归调用的结束条件
else{
PostOrder(root->
//后序递归遍历root的左子树
PostOrder(root->
//后序递归遍历root的右子树
cout<
root->
//访问根结点的数据域
二叉树的后序遍历非递归算法PostOrder
*root)
top=-1;
//采用顺序栈,并假定栈不会发生上溢
while(root!
=NULL||top!
=-1)
=NULL)
top++;
s[top].ptr=root;
s[top].flag=1;
root=root->
}
while(top!
=-1&
&
s[top].flag==2)
root=s[top--].ptr;
cout<
if(top!
=-1){
s[top].flag=2;
root=s[top].ptr->
}
二叉树前序遍历递归算法PreOrder
PreOrder(BiNode<
if(root==NULL)return;
PreOrder(root->
//前序递归遍历root的左子树
PreOrder(root->
//前序递归遍历root的右子树
二叉树的前序遍历非递归算法PreOrder
//采用顺序栈,并假定不会发生上溢
while(root!
=NULL)
{
s[++top]=root;
if(top!
=-1){
root=s[top--];
root=root->
二叉树的析构函数算法BiTree
~BiTree(BiNode<
Release(root);
Release(BiNode<
if(root!
=NULL){
Release(root->
//释放左子树
//释放右子树
deleteroot;
二叉树的中序遍历递归算法InOrder
InOrder(BiNode<
if(root==NULL)return;
InOrder(root->
//中序递归遍历root的左子树
//中序递归遍历root的右子树
2.线索链表
线索链表结点声明
enumflag{Child,Thread};
//枚举类型,枚举常量Child=0,Thread=1
structThrNode
ThrNode<
flagltag,rtag;
线索链表类声明
classInThrBiTree
InThrBiTree(ThrNode<
*root);
//构造函数,建立中序线索链表
~InThrBiTree();
//析构函数,释放线索链表中各结点的存储空间
ThrNode*Next(ThrNode<
*p);
//查找结点p的后继
voidInOrder(ThrNode<
//中序遍历线索链表
//指向线索链表的头指针
voidCreat(ThrNode<
//构造函数调用
voidThrBiTree(ThrNode<
中序线索链表构造函数算法InThrBiTree
InThrBiTree:
InThrBiTree(ThrNode<
Creat(root);
pre=NULL;
ThrBiTree(root);
voidInThrBiTree:
Creat(ThrNode<
root=newThrNode<
//生成一个结点,左右标志均置0
ltag=0;
rtag=0;
ThrBiTree(ThrNode<
ThrBiTree(root->
if(!
lchild){//对root的左指针进行处理
ltag=1;
lchild=pre;
//设置pre的前驱线索
rchild)root->
rtag=1;
//对root的右指针进行处理
if(pre->
rtag==1)pre->
rchild=root;
//设置pre的后继线索
pre=root;
中序线索链表查找后继的算法Next
ThrNode<
*InThrBiTree:
Next(ThrNode<
*p)
if(p->
rtag==1)q=p->
//右标志为1,可直接得到后继结点
q=p->
//工作指针初始化,
while(q->
ltag==0)//查找最左下结点
q=q->
returnq;
voidInThrBiTree:
InOrder(ThrNode<
//如果线索链表为空,则空操作返回
p=root;
while(p->
ltag==0)//查找中序遍历序列的第一个结点p并访问
p=p->
p->
while(p->
=NULL)//当结点p存在后继,依次访问其后继结点
p=Next(p);
3.哈夫曼树
voidHuffmanTree(elementhuffTree[],intw[],intn)
for(i=0;
i<
2*n-1;
i++)//初始化
huffTree[i].parent=-1;
huffTree[i].lchild=-1;
huffTree[i].rchild=-1;
for(i=0;
n;
i++)//构造n棵只含有根结点的二叉树
huffTree[i].weight=w[i];
for(k=n;
k<
k++)//n-1次合并
{
Select(huffTree,i1,i2);
//在huffTree中找权值最小的两个结点i1和i2
huffTree[i1].parent=k;
//将i1和i2合并,则i1和i2的双亲是k
huffTree[i2].parent=k;
huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight;
huffTree[k].lchild=i1;
huffTree[k].rchild=i2;
1.注意理解有关树的各种递归算法的执行步骤。
2.注意字符类型数据在输入时的处理。
3.重点理解如何利用栈结构实现非递归算法。
实验四图的操作
设计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验 指导书