数据结构试验指导书.docx

上传人:b****6 文档编号:4692532 上传时间:2022-12-07 格式:DOCX 页数:24 大小:27.39KB
下载 相关 举报
数据结构试验指导书.docx_第1页
第1页 / 共24页
数据结构试验指导书.docx_第2页
第2页 / 共24页
数据结构试验指导书.docx_第3页
第3页 / 共24页
数据结构试验指导书.docx_第4页
第4页 / 共24页
数据结构试验指导书.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构试验指导书.docx

《数据结构试验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构试验指导书.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构试验指导书.docx

数据结构试验指导书

数据结构实验指导书

前言

《数据结构》是软件工程等专业的一门核心基础课程,也是很多高校考研专业课之一。

它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。

这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。

通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。

学习这门课程,习题和实验是两个关键环节。

学生理解算法,上机实验是最佳的途径之一。

因此,实验环节的好坏是学生能否学好《数据结构》的关键。

为了更好地配合学生实验,特编写实验指导书。

一、实验目的

更好的理解算法的思想、培养算法设计、分析及程序调试能力。

二、实验要求

1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据及预期输出数据。

2、独立完成或在指导教师的帮助下,完成实验项目,得出正确的实验结果。

3、遵守实验室规章制度、不缺席、按时上、下机。

4、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。

5、实验项目有一次未完成,扣5分,两次以上未完成者,平时成绩以零分记,不允许参加期末考试。

三、实验环境VC++6.0或其它C++集成环境

四、说明

1、本实验的所有算法中元素类型可以根据实际需要选择。

2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,必须完成,否则实验不合格。

3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。

4、所有实验项目布置在在线评测系统平台(OnlineJudgeSystem)上,校内访问IP:

59.73.73.133,每位学生需实名注册账号,并将完成的实验项目在平台上提交,平台能够实现自动评测。

五、参考书目

《数据结构》(C++语言描述)王红梅等清华大学出版社

《DATASTRUCTUREWITHC++》WilliamFord,WilliamTopp

清华大学出版社(影印版)

 

目录

实验一线性表的操作3

实验二栈、队列的操作4

实验三二叉树的操作5

实验四图的操作12

实验五查找14

实验六排序15

实验七综合实验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、掌握二叉树、哈夫曼树和树的特点。

掌握它们的常见算法。

2、提交实验报告,报告内容包括:

目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。

三、实验内容:

1.设计实现二叉树类,要求:

(1)编写一个程序,首先建立不带头结点的二叉链式存储结构的二叉树,然后分别输出按照前序遍历二叉树、中序遍历二叉树和后序遍历二叉树访问各结点的序列信息,最后再测试查找函数和撤销函数的正确性。

(2)实现二叉树层次遍历的非递归算法。

(3)编写一主函数来验证算法实现。

2.假设二叉树采用链式存储结构进行存储,编写一个算法,输出一个二叉树的所有叶子结点,并统计叶子结点个数。

*3.设计实现二叉线索链表类,要求:

(1)编写一个程序,首先建立中序线索链表的二叉树,然后实现中序线索链表的遍历算法。

(2)编写一主函数来验证算法实现。

*4.编写求二叉树高度的函数。

*5.编写创建哈夫曼树和生成哈夫曼编码的算法。

*6.假设二叉树采用链式存储结构进行存储,试设计一个算法,输出从每个叶子结点到根结点的路径。

*7.假设二叉树采用链式存储结构进行存储,试设计一个算法,求二叉树的宽度(即具有结点数最多的层次上结点总数)

四、程序样例

1.二叉树

二叉链表结点声明

template

structBiNode

{

Tdata;

BiNode*lchild,*rchild;

};

二叉链表类声明

template

classBiTree

{

public:

BiTree(){root=NULL;}//无参构造函数,初始化一棵空的二叉树

BiTree(BiNode*root);//有参构造函数,初始化一棵二叉树,其前序序列由键盘输入

~BiTree();//析构函数,释放二叉链表中各结点的存储空间

voidPreOrder(BiNode*root);//前序遍历二叉树

voidInOrder(BiNode*root);//中序遍历二叉树

voidPostOrder(BiNode*root);//后序遍历二叉树

voidLeverOrder(BiNode*root);//层序遍历二叉树

private:

BiNode*root;//指向根结点的头指针

voidCreat(BiNode*root);//有参构造函数调用

voidRelease(BiNode*root);//析构函数调用

};

二叉树的层序遍历算法LeverOrder

template

voidBiTree:

:

LeverOrder(BiNode*root)

{

front=rear=0;//采用顺序队列,并假定不会发生上溢

if(root==NULL)return;

Q[++rear]=root;

while(front!

=rear)

{

q=Q[++front];

cout<data;

if(q->lchild!

=NULL)Q[++rear]=q->lchild;

if(q->rchild!

=NULL)Q[++rear]=q->rchild;

}

}

二叉树的构造函数算法BiTree

template

BiTree:

:

BiTree(BiNode*root)

{

creat(root);

}

template

voidBiTree:

:

Creat(BiNode*root)

{

cin>>ch;

if(ch=='#')root=NULL;//建立一棵空树

else{

root=newBiNode;//生成一个结点

root->data=ch;

Creat(root->lchild);//递归建立左子树

Creat(root->rchild);//递归建立右子树

}

}

二叉树的后序遍历递归算法PostOrder

template

voidBiTree:

:

PostOrder(BiNode*root)

{

if(root==NULL)return;//递归调用的结束条件

else{

PostOrder(root->lchild);//后序递归遍历root的左子树

   PostOrder(root->rchild);//后序递归遍历root的右子树

    cout<data;//访问根结点的数据域

}

}

二叉树的后序遍历非递归算法PostOrder

template

voidBiTree:

:

PostOrder(BiNode*root)

{

top=-1;//采用顺序栈,并假定栈不会发生上溢

while(root!

=NULL||top!

=-1)

{

while(root!

=NULL)

{

top++;

s[top].ptr=root;

s[top].flag=1;

root=root->lchild;

  }

while(top!

=-1&&s[top].flag==2)

{

root=s[top--].ptr;

cout<data;

}

if(top!

=-1){

s[top].flag=2;

root=s[top].ptr->rchild;

         }

}

}

二叉树前序遍历递归算法PreOrder

template

voidBiTree:

:

PreOrder(BiNode*root)

{

if(root==NULL)return;//递归调用的结束条件

else{

cout<data;//访问根结点的数据域

PreOrder(root->lchild);//前序递归遍历root的左子树

PreOrder(root->rchild);//前序递归遍历root的右子树

}

}

二叉树的前序遍历非递归算法PreOrder

template

voidBiTree:

:

PreOrder(BiNode*root)

{

top=-1;//采用顺序栈,并假定不会发生上溢

while(root!

=NULL||top!

=-1)

{

while(root!

=NULL)

{

cout<data;

s[++top]=root;

root=root->lchild;

}

if(top!

=-1){

root=s[top--];

root=root->rchild;

}

}

}

二叉树的析构函数算法BiTree

template

BiTree:

:

~BiTree(BiNode*root)

{

Release(root);

}

voidBiTree:

:

Release(BiNode*root)

{

if(root!

=NULL){

Release(root->lchild);//释放左子树

Release(root->rchild);//释放右子树

deleteroot;

}

}

二叉树的中序遍历递归算法InOrder

template

voidBiTree:

:

InOrder(BiNode*root)

{

if(root==NULL)return;//递归调用的结束条件

else{

InOrder(root->lchild);//中序递归遍历root的左子树

cout<data;//访问根结点的数据域

InOrder(root->rchild);//中序递归遍历root的右子树

}

}

2.线索链表

线索链表结点声明

enumflag{Child,Thread};//枚举类型,枚举常量Child=0,Thread=1

template

structThrNode

{

Tdata;

ThrNode*lchild,*rchild;

flagltag,rtag;

};

线索链表类声明

template

classInThrBiTree

{

public:

InThrBiTree(ThrNode*root);//构造函数,建立中序线索链表

~InThrBiTree();//析构函数,释放线索链表中各结点的存储空间

ThrNode*Next(ThrNode*p);//查找结点p的后继

voidInOrder(ThrNode*root);//中序遍历线索链表

private:

ThrNode*root;//指向线索链表的头指针

voidCreat(ThrNode*root);//构造函数调用

voidThrBiTree(ThrNode*root);//构造函数调用

};

中序线索链表构造函数算法InThrBiTree

template

InThrBiTree:

:

InThrBiTree(ThrNode*root)

{

Creat(root);

pre=NULL;

ThrBiTree(root);

}

template

voidInThrBiTree:

:

Creat(ThrNode*root)

{

cin>>ch;

if(ch=='#')root=NULL;//建立一棵空树

else{

root=newThrNode;//生成一个结点,左右标志均置0

root->data=ch;root->ltag=0;root->rtag=0;

Creat(root->lchild);//递归建立左子树

Creat(root->rchild);//递归建立右子树

}

}

template

voidInThrBiTree:

:

ThrBiTree(ThrNode*root)

{

if(root==NULL)return;

ThrBiTree(root->lchild);

if(!

root->lchild){//对root的左指针进行处理

root->ltag=1;

root->lchild=pre;//设置pre的前驱线索

}

if(!

root->rchild)root->rtag=1;//对root的右指针进行处理

if(pre->rtag==1)pre->rchild=root;//设置pre的后继线索

pre=root;

ThrBiTree(root->rchild);

}

中序线索链表查找后继的算法Next

template

ThrNode*InThrBiTree:

:

Next(ThrNode*p)

{

if(p->rtag==1)q=p->rchild;//右标志为1,可直接得到后继结点

else{

q=p->rchild;//工作指针初始化,

while(q->ltag==0)//查找最左下结点

q=q->lchild;

}

returnq;

}

中序线索链表查找后继的算法Next

template

voidInThrBiTree:

:

InOrder(ThrNode*root)

{

if(root==NULL)return;//如果线索链表为空,则空操作返回

p=root;

while(p->ltag==0)//查找中序遍历序列的第一个结点p并访问

p=p->lchild;

cout<data;

while(p->rchild!

=NULL)//当结点p存在后继,依次访问其后继结点

{

p=Next(p);

cout<data;

}

}

中序线索链表构造函数算法InThrBiTree

template

InThrBiTree:

:

InThrBiTree(ThrNode*root)

{

Creat(root);

pre=NULL;

ThrBiTree(root);

}

template

voidInThrBiTree:

:

Creat(ThrNode*root)

{

cin>>ch;

if(ch=='#')root=NULL;//建立一棵空树

else{

root=newThrNode;//生成一个结点,左右标志均置0

root->data=ch;root->ltag=0;root->rtag=0;

Creat(root->lchild);//递归建立左子树

Creat(root->rchild);//递归建立右子树

}

}

template

voidInThrBiTree:

:

ThrBiTree(ThrNode*root)

{

if(root==NULL)return;

ThrBiTree(root->lchild);

if(!

root->lchild){//对root的左指针进行处理

root->ltag=1;

root->lchild=pre;//设置pre的前驱线索

}

if(!

root->rchild)root->rtag=1;//对root的右指针进行处理

if(pre->rtag==1)pre->rchild=root;//设置pre的后继线索

pre=root;

ThrBiTree(root->rchild);

}

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;i

huffTree[i].weight=w[i];

for(k=n;k<2*n-1;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.重点理解如何利用栈结构实现非递归算法。

实验四图的操作

实验类型:

设计

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1