最难记的结构——图

图,在日常生活中,常常会用到,但是平日里在纸上只是几个圆圈,几个数字,几笔几画便可以了。

但是在编程中,需要的是各种各样的类型定义,一次方便存储,也方便我们结构化。不同的存储结构,命名也不同,许许多多加起来,有各自嵌套,一个字,乱!

(以下是以邻接表的存储结构为样例)

首先,分清楚图有哪些东西要存放的。

1、图的总顶点数,图的总边数,以及图的所有顶点集合。

2、在图的所有顶点集合中,每一个顶点包含该顶点本身的数据,还有所有与该顶点有边相连接的顶点的存储位置。

3、边节点的类型定义(在存储所有与该顶点有边相连接的顶点的存储位置需要边节点的类型定义)

这是我定义的代码,别的不说,对于刚接触图的萌新贼不友好,没有注释就只能翻来翻去的看。

 1 //图的定义
 2 typedef struct
 3 {
 4     int vex, arc; //图的顶点数量(vex)和边数量(arc)
 5     AdjList vertices;
 6 }ALGraph;
 7
 8 //顶点列表的定义
 9 typedef struct VNode
10 {
11     int data;
12     struct ArcNode *firstArc; //该顶点的第一条边的指针
13 }VNode, AdjList[MVNum]; //AdjList表示邻接表类型
14
15 //边节点的定义
16 typedef struct ArcNode
17 {
18     int adjvex;    //当前的节点的顶点位置
19     struct ArcNode *nextArc; //下一条边的指针
20 }ArcNode, *L;

大概的结构图是这样的:

图
{
      顶点数量和边数量
      顶点列表
      {
            顶点内容信息
            第一条边的指针->边节点
                                 {
                                       当前点的信息
                                        下一条边的指针->边节点
                                 }
      }
}    

反正我是。。。。。。。。。。。。。。。。。

对于我而言,用邻接表存储图更容易理解图的深度搜索和广度搜索,因为其的操作与树的先序遍历与层次遍历很相似,还是粘代码。

两者之间,明显的差别就是在输出前调用一个数组判断当前节点是否已被访问过(visited[]={false})。

深度搜索:

 1 //深度搜索
 2 void DFS_AL(ALGraph G, int v)
 3 {
 4 //    访问当前的顶点
 5     cout << " " << v;
 6     visited[v] = true;
 7
 8     L p; //与顶点连接的下一边
 9     int w; //顶点连接的下一点
10
11     p = G.vertices[v].firstArc;
12     while(p != NULL)
13     {
14 //        取得这一条边链接的点,看是否已访问
15         w = p->adjvex;
16         if(!visited[w])
17             DFS_AL(G, w); //未访问则递归
18         p = p->nextArc;
19     }
20 }

广度搜索(因为不是二叉树,所以用一个for循环依次遍历入队):

 1 //广度搜索
 2 void BFS_AL(ALGraph G, int v)
 3 {
 4 //    队列q,u用作存储出队的元素的下标
 5     queue<int> q;
 6     int u;
 7
 8 //    访问顶点
 9     cout << " " << v;
10     visited[v] = true;
11
12 //    入队
13     q.push(v);
14     while(!q.empty())
15     {
16         u = q.front();
17         q.pop();
18
19 //        for循环,进行出队元素的所有的边的点访问,入队
20         for(L p=G.vertices[u].firstArc; p!=NULL; p=p->nextArc)
21         {
22             //对于出队的点,判断是否有邻接点,有则访问,然后入队
23             if(!visited[p->adjvex])
24             {
25                 cout << " " << p->adjvex;
26                 visited[p->adjvex] = true;
27                 q.push(p->adjvex);
28             }
29         }
30     }
31 }

这就是我理解的图的邻接表的大概,如果有什么不足的欢迎提出。

接下来得理解好图的相关应用——普里姆算法,克鲁斯卡尔算法等。。。。。

坚持不懈方能水滴石穿!

原文地址:https://www.cnblogs.com/ZwQuan/p/10891294.html

时间: 2024-08-30 08:31:16

最难记的结构——图的相关文章

4、非线性结构--图——数据结构【基础篇】

非线性结构--图 图的几个类别: 有向图 --有向图采用<>表示 无向图--无向图采用()表示 完全图无向图--如果具有n个顶点,n(n-1)/2条边的图 完全图有向图--如果具有n个顶点,n(n-1)条弧的图 稀疏图--如果边数小于完全图的边数 稠密图--如果边数大于完全图的边数 图的几个基本概念: 度--在图中,一个顶点依附的边数或弧的数目,某个顶点的出度和入度之和称为该顶点的度 入度--在图中,一个顶点依附的弧头数目 出度--在图中,一个顶点依附的弧尾数目 图的存贮结构: 1.图的邻接矩

7-4-无向图的邻接多重表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 无向图的邻接多重表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c      

7-3-有向图的十字链表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向图的十字链表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c        

zblog2.3的缺点:纯静态化无法实现栏目名加id的网址结构[图]

写博客应半年了,因为对程序语言比较感兴趣,因此也关注博客系统的发展,对于国内博主来说,ZBLOG似乎是最佳的选择,功能比较完善,也比较好修改模板,当然,你还需要写CSS代码,模板里面基本都用标签完成的,这基本就是模块儿化设计了,确实比较方便.去年我开始建自己的博客时,zblog-asp程序还只是2.2版本,静态化中心的功能并不好用,尤其是纯静态化的网址非常不美好,这对于我们这种有强迫症的人非常不舒服,因此选择了采用插件完成纯静态化功能,生成纯静态的html网页,虽然要麻烦一点,但是也没有办法,这

html 难记的标签

<!doctype html>声明文档类型.解决ie浏览器下怪异模式问题: <meta http-aquiv='cache-contrl' content='no-siteapp' />禁止百度转码 <meta http-aquiv='x-ua-cmpatibie' content='IE=edge.chrome=1' />规定优先使用最新版ie浏览器和chrome 定义列表: <dl> <dt>项目名称</dt> <dd>

常用且难记的一些css

1.多行文字超出隐藏,自动追加 ... 移动端兼容更好,pc下只能兼容 Safari.Opera 以及 Chrome 等部分浏览器,挺常用. (注:为什么要同时加这几个css不在这里详细叙述,详见) /* Safari.Opera 以及 Chrome */ overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 2.移

insertAdjacentHTML用法(真鸡儿难记)

insertAdjacentHTML 方法:在指定的地方插入html标签语句 原型:insertAdajcentHTML(swhere,stext) 参数: swhere: 指定插入html标签语句的地方, stext:要插入的内容 有四种值可用: 1.     beforeBegin: 插入到标签开始前------beforeBegin<div>文本</div> 2.     afterBegin:插入到标签开始标记之后------<div>afterBegin文本&

图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)

图(Graph)是一种非线性结构 图的特点(多对多),顶点之间的关系是任意的,图中任意两个顶点之间都可能相关,顶点的前驱和后继个数无限制. 图:数据元素间存在多对多关系的数据结构,加上一组基本操作构成的抽象数据类型. 图的基本术语 顶点:图中的数据元素. 弧:若 <v, w>∈VR,则 <v, w> 表示从 v 到 w 的一条弧,且称 v 为弧尾,称 w 为弧头,此时的图称为有向图. G1 = (V1, A1)          V1 = {v1, v2, v3, v4} A1 =

数据结构 - 图的存储结构

图的抽象数据类型定义 图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型. 图的抽象数据类型定义如下: ADT Graph{ 数据对象V:具有相同特性的数据元素的集合,称为顶点集. 数据关系R:R={VR} VR={<v,w>|<v,w>| v,w?V∧p(v,w) ,<v,w>表示 从v到w的弧,P(v,w)定义了弧<v,w>的信息 } 基本操作P: Create_Graph() : 图的创建操作. 初始条件:无. 操作结果:生成一个没有顶点的空图