数据结构实验三

合集下载

《数据结构》实验报告

《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

北邮数据结构实验3哈夫曼编码

北邮数据结构实验3哈夫曼编码

数据结构实验报告实验名称:实验3——哈夫曼编码学生姓名:班级:班内序号:学号:日期:2013年11月24日1.实验要求利用二叉树结构实现赫夫曼编/解码器。

基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。

3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。

5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

2. 程序分析2.1存储结构:struct HNode{char c;//存字符内容int weight;int lchild, rchild, parent;};struct HCode{char data;char code[100];}; //字符及其编码结构class Huffman{private:HNode* huffTree; //Huffman树HCode* HCodeTable; //Huffman编码表public:Huffman(void);void CreateHTree(int a[], int n); //创建huffman树void CreateCodeTable(char b[], int n); //创建编码表void Encode(char *s, string *d); //编码void Decode(char *s, char *d); //解码void differ(char *,int n);char str2[100];//数组中不同的字符组成的串int dif;//str2[]的大小~Huffman(void);};结点结构为如下所示:三叉树的节点结构:struct HNode//哈夫曼树结点的结构体{ int weight;//结点权值int parent;//双亲指针int lchild;//左孩子指针int rchild;//右孩子指针char data;//字符};示意图为:int weight int parent int lchild int rchild Char c 编码表节点结构:struct HCode//编码表结构体{char data;//字符char code[100];//编码内容};示意图为:基本结构体记录字符和出现次数:struct node{int num;char data;};示意图为:2.关键算法分析(1).初始化:伪代码:1.输入需要编译的文本内容2.将输入的内容保存到数组str1中3.统计出现的字符数目,并且保存到变量count中4.统计出现的不同的字符,存到str2中,将str2的大小存到dif中时间复杂度O(n!)(2).创建哈夫曼树算法伪代码:1.创建一个长度为2*n-1的三叉链表2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前n个结点的data域,并将对应结点的孩子域和双亲域赋为空3.从三叉链表的第n个结点开始,3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其下标x,y。

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用数据结构实验三:栈和队列的应用在计算机科学领域中,数据结构是组织和存储数据的重要方式,而栈和队列作为两种常见的数据结构,具有广泛的应用场景。

本次实验旨在深入探讨栈和队列在实际问题中的应用,加深对它们特性和操作的理解。

一、栈的应用栈是一种“后进先出”(Last In First Out,LIFO)的数据结构。

这意味着最后进入栈的元素将首先被取出。

1、表达式求值在算术表达式的求值过程中,栈发挥着重要作用。

例如,对于表达式“2 + 3 4”,我们可以通过将操作数压入栈,操作符按照优先级进行处理,实现表达式的正确求值。

当遇到数字时,将其压入操作数栈;遇到操作符时,从操作数栈中弹出相应数量的操作数进行计算,将结果压回操作数栈。

最终,操作数栈中的唯一值就是表达式的结果。

2、括号匹配在程序代码中,检查括号是否匹配是常见的任务。

可以使用栈来实现。

遍历输入的字符串,当遇到左括号时,将其压入栈;当遇到右括号时,弹出栈顶元素,如果弹出的左括号与当前右括号类型匹配,则继续,否则表示括号不匹配。

3、函数调用和递归在程序执行过程中,函数的调用和递归都依赖于栈。

当调用一个函数时,当前的执行环境(包括局部变量、返回地址等)被压入栈中。

当函数返回时,从栈中弹出之前保存的环境,继续之前的执行。

递归函数的执行也是通过栈来实现的,每次递归调用都会在栈中保存当前的状态,直到递归结束,依次从栈中恢复状态。

二、队列的应用队列是一种“先进先出”(First In First Out,FIFO)的数据结构。

1、排队系统在现实生活中的各种排队场景,如银行排队、餐厅叫号等,可以用队列来模拟。

新到达的顾客加入队列尾部,服务完成的顾客从队列头部离开。

通过这种方式,保证了先来的顾客先得到服务,体现了公平性。

2、广度优先搜索在图的遍历算法中,广度优先搜索(BreadthFirst Search,BFS)常使用队列。

从起始节点开始,将其放入队列。

数据结构实验三实验报告

数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。

具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。

二、实验原理树是一种非线性的数据结构,由结点和边组成。

树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。

树的基本操作包括插入、删除和查找。

在本次实验中,我们采用二叉树作为实现树的数据结构。

二叉树是一种特殊的树,每个结点最多只有两个子结点。

根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。

三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。

然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。

2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。

我们可以通过递归的方式实现插入操作。

具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。

如果当前结点为空,则将新的结点作为当前结点。

3. 实现删除操作删除操作是将指定的结点从树中移除的过程。

我们同样可以通过递归的方式实现删除操作。

具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。

如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。

- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。

- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。

4. 实现查找操作查找操作是在树中寻找指定值的过程。

同样可以通过递归的方式实现查找操作。

具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
{
x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");

数据结构实训实验报告

数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。

为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。

二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。

2. 熟练运用数据结构解决实际问题,提高算法设计能力。

3. 培养团队合作精神,提高实验报告撰写能力。

三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。

(2)实现线性表的插入、删除、查找等操作。

2. 栈与队列(1)实现栈的顺序存储和链式存储。

(2)实现栈的入栈、出栈、判断栈空等操作。

(3)实现队列的顺序存储和链式存储。

(4)实现队列的入队、出队、判断队空等操作。

3. 树与图(1)实现二叉树的顺序存储和链式存储。

(2)实现二叉树的遍历、查找、插入、删除等操作。

(3)实现图的邻接矩阵和邻接表存储。

(4)实现图的深度优先遍历和广度优先遍历。

4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。

(2)实现二分查找算法。

(3)设计并实现一个简单的学生成绩管理系统。

四、实验步骤1. 熟悉实验要求,明确实验目的和内容。

2. 编写代码实现实验内容,对每个数据结构进行测试。

3. 对实验结果进行分析,总结实验过程中的问题和经验。

4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。

五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。

(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。

2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。

(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。

3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间), 试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所 到达另一场所。
2)实验要求:利用 Dijkstra 算法求最低的票价 3) 实现提示:
该问题可以归结为一个求带权有向图中顶点间最短路径的问题。 建立以票价为权的有向图,再利用 Dijkstra 算法求最短路径及其路径长度。
}ArcNode; //表结点 # define VertexType int //顶点元素类型
typedef struct VNode { int degree,indegree; //顶点的度,入度 VertexType data; ArcNode *firstarc;
}Vnode /*头结点*/, AdjList[MAX_VERTEX_NUM]; typedef struct{
3.给定实际背景,解决最短路径问题。 数据结构为: typedef struct Graph{ int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题还是采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个
3)实验提示: 图的存储可采用邻接表或邻接矩阵; 图存储数据类型定义 (邻接表存储)
# define MAX_VERTEX_NUM 8 //顶点最大个数 typedef struct ArcNode
{ int adjvex; struct ArcNode *nextarc; int weight; //边的权
4.利用最小生成树算法解决通信网的总造价最低问题 1)问题描述:若在 n 个城市之间建通信网络,架设 n-1 条线路即可。如何以最低的经济
代价建设这个通信网,是一个网络的最小生成树问题。 2)实验要求:利用 Prim 算法求网的最小生成树。 3) 实现提示:通信线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无
测试结果:
4.利用最小生成树算法解决通信网的总造价最低问题。 数据结构为: typedef struct Graph{ int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题仍然采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个
2. 教学计划编制问题。
数据结构为: typedef struct Graph{
int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题依旧采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个 二维数组 adj 来表示各个顶点之间的邻接关系。 拓扑排序。首先增设一个一维数组 indegree 来存放每一个顶点的入度。入度为零表示没 有前驱节点,删除该顶点以及它的出弧就等价于弧头顶点的入度减 1。要实现拓扑算法可以借 助堆栈,凡是网中入度为零的顶点都将其进栈。具体步骤为:1)将没有前驱结点(入度为零) 的顶点进栈;2)从栈中退出栈顶元素输出,并把该顶点引出的所有弧删去,即把它的各个邻 接点的入度减 1,同时将当前已输出的顶点个数加 1;3)将新的入度为零的顶点再进栈;4) 重复 2)、3)两步,直到栈空为止。此时或者已输出全部顶点,或者剩下的顶点没有入度为 零的顶点。 栈在这里的作用只是保存当前入度为零的顶点,并使之处理有序。 测试结果:
AdjList vertices; int vexnum,arcnum;//顶点的实际数,边的实际数 }ALGraph; 4)注意问题: 注意理解各算法实现时所采用的存储结构。 注意区别正、逆邻接。 2. 教学计划编制问题
1)问题描述:软件专业的学生要学习一系列课程,其中有些课程必须在其先修课完成后 才能学习。
/*队列的数据结构*/ typedef struct {
int elem[MAX_VERTEX_NUM]; int front,rear; }Queue; Graph G; int visited[MAX_VERTEX_NUM]; Graph CreateAG(int n,int m) { int i=0,j=0,a=0,b=0; for(i=0;i<n;i++) {
程序运行 20 分
回答问题 15 分
实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
二维数组 adj 来表示各个顶点之间的邻接关系,二维数组的值表示权值。 Dijkstra 算法。为了球最短路径采用三个数组:1)S 数组,S[i]=0 表示顶点 i 未进入 S
集合,S[i]=1 表示顶点 i 已进入 S 集合;2)dist[i]表示当前已知的从源点到顶点 i 的最短 路径长度;3)path[i]表示在当前已知的从源点到顶点 i 的最短路径上,i 前面的那个顶点的 下标。把图中顶点集合 V 分成两组,第一组为已求出最短路径的顶点集合(用 S 表示,初始 时 S 中只有一个源点,以后每求得一条最短路径 , 就将加入到集合 S 中,直到全部顶点都加 入到 S 中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用 U 表示),按最 短路径长度的递增次序依次把第二组的顶点加入 S 中。在加入的过程中,总保持从源点 v 到 S 中各顶点的最短路径长度不大于从源点 v 到 U 中任何顶点的最短路径长度。此外,每个顶点 对应一个距离,S 中的顶点的距离就是从 v 到此顶点的最短路径长度,U 中的顶点的距离,是 从 v 到此顶点只包括 S 中的顶点为中间顶点的当前最短路径长度。
○有 ○无
○无报告
○有 ○无
教师签字:
一、实验目的 1、 实验目的:通过实验使学生理解图的主要存储结构,掌握图的构造算法、图的深度优先和 广度优先遍历算法,能运用图解决具体应用问题。
二、实验题目与要求 要求:第 1 题 为必做题,2,3,4 至少选一 1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
2)实验要求:假设每门课程的学习时间为一个学期,试为该专业的学生设计教学计划, 使他们能在最短时间内修完专业要求的全部课程。
3) 实现提示: 以顶点代表课程,弧代表课程的先后修关系,按课程先后关系建立有向无环图。 利用拓扑排序实现。
3.给定实际背景,解决最短路径问题 1)问题描述:假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区
1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能: 1…图的建立 2…深度优先遍历图 3…广度优先遍历图 0…结束
2)实验要求:在程序中定义下述函数,并实现要求的函数功能: CreateGraph(): 按从键盘的数据建立图 DFSGrahp():深度优先遍历图 BFSGrahp():广度优先遍历图
向网。为简单起见,图的顶点数不超过 10 个,网中边的权值设置成小于 100。
三、 实验过程与实验结果 1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
数据结构为: typedef struct Graph{
int vertex[MAX_VERTEX_NUM];//顶点信息 int adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个二维 数组 adj 来表示各个顶点之间的邻接关系。 图的深度优先遍历,从图中任一顶点 v 开始访问,然后访问它的任一邻接顶点 w1;再从 w1 出发,访问与其邻接但还没访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,···, 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止;接着退回一部,回溯到 u 的前一个邻接点,看它是否还有其它没有被访问的邻接点。如果有,则访问此节点;若没有, 就再退回一步进行搜索。重复上述过程,直至图中所有和 v 连通的顶点都被访问到。 图的广度优先遍历,要借助队列实现。广度优先搜索类似于树的层次遍历过程。它需要 借助一个队列来实现。要想遍历每一个顶点,我们可以设 v 为第一层,再逐个遍历每一层的 每个顶点。首先创建一个 visited 数组,用来记录已被访问过的顶点,然后创建一个队列, 用来存放每一层的顶点。从图中的 v 开始访问,将已访问过的 visited[v]数组的值设置为 true,同时将 v 入队。只要队列不空,则重复如下操作:(1)队头顶点 u 出队。(2)依次检查 u 的所有邻接顶点 w,若 visited[w]的值为 false,则访问 w,并将 visited[w]置为 true,同 时将 w 入队。 测试结果:
为实现 Prim 算法,需设置一个辅助数组 closedge,以记录从 U 到 V-U 具有最小权值的边。 对每个顶点 v 属于 V-U,在辅助数组中存在一个相应分量 closedge[v],它包括两个域,其中 lowcost 域用来保存集合 U 中各顶点与该顶点构成的边中具有最小权值的边的权值。即 closedge[v].lowcost = min{wuv|u∈U}。假设初始状态时 U={k}(k 为出发的顶点),这时有 closedge[k]. lowcost=0,表示顶点 k 已加人集合 U 中。然后不断选取权值最小的边(v,u)(u ∈U,v∈V-U),每选取一条边,就将 closedge[ v]. lowcost 置为 0,表示顶点 v 加入集合 U。 由于顶点 v 从集合 V-U 进人集合 U 后,这两个集合的内容发生了变化,就需要依据新的情况 更新每一个不属于 U 集的顶点的 lowcost 值。然后再选取出 lowcost 值最小的顶点加人集合 U,依次类推,直至所有顶点都加入集合 U 为止。
相关文档
最新文档