对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法。

邻接表的处理方法是这样的。

1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。

例如图7-4-6就是一个无向图的邻接表结构。

若是有向图,邻接表的结构是类似的,如图7-4-7,以顶点作为弧尾来存储边表容易得到每个顶点的出度,而以顶点为弧头的表容易得到顶点的入度,即逆邻接表。

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可,如图7-4-8所示。

下面示例无向图的邻接表创建:(改编自《大话数据结构》)

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 

#include<iostream>
using namespace std;

#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */

typedef struct EdgeNode/* 边表结点  */
{
    int adjvex;/* 邻接点域,存储该顶点对应的下标 */
    EdgeType weight;/* 用于存储权值,对于非网图可以不需要 */
    struct EdgeNode *next; /* 链域,指向下一个邻接点 */
} EdgeNode;

typedef struct VextexNode/* 顶点表结点 */
{
    VertexType data;/* 顶点域,存储顶点信息 */
    EdgeNode *firstedge;/* 边表头指针 */
} VextexNode, AdjList[MAXVEX];

typedef struct
{
    AdjList adjList;
    int numNodes, numEdges; /* 图中当前顶点数和边数 */
} GraphAdjList;

void CreateALGraph(GraphAdjList *Gp)
{
    int i, j, k;
    EdgeNode *pe;
    cout << "输入顶点数和边数(空格分隔):" << endl;
    cin >> Gp->numNodes >> Gp->numEdges;

for (i = 0 ; i < Gp->numNodes; i++)
    {
        cout << "输入顶点信息:" << endl;
        cin >> Gp->adjList[i].data;
        Gp->adjList[i].firstedge = NULL;/* 将边表置为空表 */
    }

for (k = 0; k <  Gp->numEdges; k++)/* 建立边表 */
    {
        cout << "输入边(vi,vj)的顶点序号i,j(空格分隔):" << endl;
        cin >> i >> j;
        pe = (EdgeNode *)malloc(sizeof(EdgeNode));
        pe->adjvex = j;/* 邻接序号为j */
        /* 将pe的指针指向当前顶点上指向的结点 */
        pe->next = Gp->adjList[i].firstedge;
        Gp->adjList[i].firstedge = pe;/* 将当前顶点的指针指向pe */

pe = (EdgeNode *)malloc(sizeof(EdgeNode));
        pe->adjvex = i;
        pe->next = Gp->adjList[j].firstedge;
        Gp->adjList[j].firstedge = pe;

}
}

int main(void)
{
    GraphAdjList GL;
    CreateALGraph(&GL);

return 0;
}

这里的邻接点插入使用了单链表创建中的头插法,对于无向图来说,一条边对应都是两个顶点,所以在循环中,一次就针对i和j分别进行了插入。

转载于:https://www.cnblogs.com/alantu2018/p/8471706.html

图 - 存储结构之邻接表相关推荐

  1. 数据结构之图的存储结构:邻接表法

    图的存储结构:邻接表法 产生条件: 邻接表法的定义: 邻接表法的特点: 邻接表法的代码定义: 邻接表法与邻接矩阵法的对比: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 邻接表法 ...

  2. 图的存储结构之邻接表(详解)

    之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 1 2 3 ...

  3. 图的存储结构之邻接表

    什么是邻接表? 邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法. 对于图G中的每个顶点Vi,将所有邻接于Vi的顶点Vj链成一个单链表,这个单链表就称为顶点Vi的邻接表 ...

  4. 数据结构之图的存储结构:邻接多重表

    图的存储结构:邻接多重表 产生条件: 邻接多重表的定义: 邻接多重表的代码定义: 删除: 性能分析: 十字链表与邻接多重表的对比 产生条件: 当用邻接矩阵法存储时:空间复杂度为O(|V|^2),太大 ...

  5. 实现图的邻接矩阵和邻接表存储

    /** *    实验题目: *        实现图的邻接矩阵和邻接表存储 *    实验目的: *        领会图的两种主要存储结构和图基本运算算法设计 *    实验内容: *       ...

  6. 数据结构——图——存储结构——邻边表

    数据结构--图--存储结构--邻边表 邻接表的处理办法 1.图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便.另外,对于顶点数组中,每个数据元素还 ...

  7. 实现图的邻接矩阵和邻接表的存储

    十五,实现图的邻接矩阵和邻接表的存储 #include<stdio.h> #include<stdlib.h> #define max 100 #define INF 3276 ...

  8. 图很难理解?看这篇图论基础与图存储结构就够了

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 作者 | 程序员吴师兄 转载自五分钟学算法(ID:CXYxiaowu) 1 前言 打算先普及一下图的相关理论支 ...

  9. 【数据结构与算法】图论基础与图存储结构

    前言 由于后续更新好几篇文章都涉及到 图 这种数据结构,因此打算先普及一下 图 的相关理论支持,如果后面的相关内容有些点不太容易理解,可以查阅此篇文章.本文不建议一口气阅读完毕,可以先浏览一遍,在后续 ...

最新文章

  1. python3.7.4安装教程桌面_Python 3.7.4 for Windows的安装
  2. 去除链接虚线边框css
  3. orion算法被解密了
  4. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
  5. LINQ学习(四):From子句
  6. 一个非常实用的 div+css 实现的导航条
  7. python里default_新手对python default不是很理解它有什么用途
  8. python包裹和运费_这个Python库真的太好用了,10行代码就能轻松搞定目标检测
  9. 七夕出手,这本情话秘籍请收好
  10. 全新UI四方聚合支付系统源码/新增USDT提现/最新更新安全升级修复XSS漏洞补单漏洞
  11. 如何给网站添加CNZZ站长统计功能代码的常用办法
  12. 为什么python文件用cmd老是出现语法错误_关于Python的py文件在Python自带的shell编辑器中运行成功,用cmd打开运行却出错 在cmd下运行结果...
  13. 阿里云上实现DDNS公网解析
  14. 极光笔记 | 极光推送业务无中断迁移上云实践
  15. Flash游戏教程:控制物体运动三法
  16. html图片左右滚动播放,CSS3实现横向滚动播放
  17. [AHK]鼠标滚轮音量调节
  18. Day 07 类、魔方方法
  19. 使用LocalDate获取本周周一和周日
  20. 大鱼吃小鱼游戏代码 基于java-swing

热门文章

  1. Cocos Creator | 飞刀大乱斗开发教程系列(二)!
  2. 【SQLite数据库学习】 连表查询
  3. Python批量重命名图片
  4. 对话框绘制完成消息_这样绘制cad施工图,提升效率至少3倍以上!
  5. ggplot 画图出现 Discrete value supplied to continuous scale
  6. matlab线性或者非线性方程(组)的求解
  7. 埃尔米特插值问题——用Python进行数值计算
  8. 【linux】循序渐进学运维-CentOS7基本配置
  9. 应广单片机应用之-呼吸灯
  10. java script this_Javavscript基础——this指向