算法与数据结构课设(有向图,无向图,有向网,无向网)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法与数据结构课程设计

报告

系(院):计算机科学学院

专业班级:教技1001

姓名:李##

学号: ******### 指导教师:***

设计时间:2012.6.16 - 2012.6.24

设计地点:4号楼2号机房

目录

一、设计方案 (1)

二、实现过程以及代码 (2)

三、测试 (20)

四、结论和分析 (23)

五、难点和收获 (23)

一、 设计方案

1.程序设计基本过程:

拿到课程设计任务书,

按照要求,需要设计有向图、有向网、无向图 、无向网四种图,以及邻接矩阵、邻接表两种数据存储结构,三层以上的显示菜单。图的操作中又包含了有关线性表、栈和队列的基本操作。由于显示菜单已给出,剩下的任务就是把函数写入其中。

2.程序流程图:

预定义 定义结构体 定义变量 各种函数

3.程序设计的原理:

图的操作都是以两种存储结构为基础的:邻接矩阵存储结构和邻接表存储结构,如有向图,有向网,无向图,无向网的创建,其他的操作都是在四种图创建后才开始进行的。所以,首先必须理解两种存储结构的定义。

图的邻接矩阵存储结构即图的数组表示法。用两个数组分别存储数据元素(如顶点)的信息和数据元素之间的关系(如边或弧)的信息。用邻接矩阵存储结构的图具有以下几点特征:

(一):顶点数:vexnum ,边(弧)数:arcnum ,图的种类:kind ;

(二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info);

(三):顶点向量(顶点名):vexs[];

其优点是以二维数组表示有n 个顶点的图时,需存放n 个顶点的信息和n*n 条弧的信息存储量。借助邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求出各个顶点的度。缺点是时间复杂度是O (n*n ),例如,构造一个具有n 个顶点和e 条边的无向网的时间复杂度为O (n*n+e*n )。

图的邻接表存储结构是图的一种链式存储结构。对图中的每个顶点建立一个单链表,每个结点由三个域组成,邻接点域adjvex (弧尾在邻接表链表中的位序),链域nextarc (下一条弧),数据域info(权值)。还要建立一个邻接表链表,用以存放顶点的data 和后继指针firstarc,表头结点以顺序结构的形式存储,便于随机访问任一顶点的单链表。邻接表存储结构的优点在于其时间复杂度小。

树的深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。从图中的某个顶点出发,访问此顶点,然后依次从该顶点出发深度优先搜索遍历图,直至图中所有与该顶点有关的路径都被访问到;此时图中若还有顶点未被访问到,则另选图中的一个未被访问的顶点作为起始点,重述上述过程,直至所有顶点都被访问到。

广度优先搜索遍历类似于树的按层次遍历的过程。以某个顶点为起始顶点,由近至远,依次访问和该顶点有路径相通的且路径长度为1,2,3,······的顶点。当图中所有顶点都被访问到后,就完成了图的广度优先搜索遍历。

求无向网的最小生成树问题有两种算法:Prima算法和Kruskal算法。Prima算法是从网中的某个顶点出发,选择与该顶点有路径的所有顶点中路径最小的一条路径,从该最小路径的另一顶点出发,重复上述过程,直至图中所有顶点都被访问完成。Kruskal算法是从网中找出所有路径最小的一条路径,记下已访问该路径的两个顶点,再次从图中找出剩下路径中的最小路径,重复上述过程,直至所有顶点都被访问完成,按访问的顺序依次输出各顶点,即构造了一棵最小生成树。

由某个集合上的一个偏序得到该集合的一个全序的操作就叫做拓扑排序。拓扑排序的过程:(1)在有向图中选择一个没有前驱的顶点并输出;(2)在图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,就得到了一个拓扑有序序列。

求关键路径的算法如下:

(1)输入e条弧,建立AOE网的存储结构;

(2)从源点v0出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间。如果得到的

拓扑有序序列中的顶点个数小于网中的顶点数,则说明网中存在环,不能求关键路

径,算法终止;否则执行第三步。

(3)从汇点vn出发,令vl[n-1]=ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i];

(4)根据各顶点的和值,求每条弧的最早开始时间e(s)和最迟开始时间e(s),若某条弧

满足条件e(s)=l(s),则为关键活动。

从某个源点到其余各顶点的最短路径问题:若从v到vi有弧,则D[i]为弧上的权值,否则D[i]为无穷大。显然,长度为D[j]=Min{D[i]|vi属于V}的路径就是从v出发的长度最短的一条路径。

二、实现过程以及代码

当电脑运行程序的时候,界面会出现一个提示菜单:请输入你要进行操作的图类型的编码:1:有向图,2:有向网,3:无向图,4:无向网,请输入选择。操作者根据自己的需要可输入相应的编码来进行操作。如选择3,则将进入关于无向图的操作。根据课设指导书要求,无向图有四个基本操作:构建邻接矩阵,构建邻接表,对已构建的邻接表进行深度遍历,对已构建的邻接表进行广度遍历,输出所有操作的结果。第一步操作就是构建,程序会提示你进行下一步操作,然后再根据各操作提示从外部输入顶点和弧的相关信息。其他三个图的操作基本与本图的操作时一致的。

代码:

#include

#include

#include

#define ERROR 0

#define OK 1

#define INFINITY INT_MAX

#define MAX_VERTEX_NUM 21

#define STACK_INIT_SIZE 100

#define STACKINCREAMENT 10

相关文档
最新文档