邻接表实现指南:图结构的链表存储方式

贾蔷
• 阅读 2

一、简介和特点 邻接表是一种常用的图存储结构,它使用链表来表示图中顶点之间的邻接关系。本文实现的邻接表类可以高效地表示稀疏图,并支持动态添加顶点和边。

‌主要特点‌:

空间效率:特别适合存储稀疏图 动态扩展:可以灵活添加顶点和边 直观表示:直接反映图的连接关系 权重支持:可以存储边的权重信息 简单接口:提供基本的图操作功能 二、与其他实现的优点 相比邻接矩阵实现,这种邻接表实现有以下优势:

1‌.空间节省‌:只存储实际存在的边 ‌2.动态扩展‌:无需预先确定图的大小 ‌3.高效遍历‌:可以快速访问某个顶点的所有邻接点 ‌4.权重灵活‌:每条边可以存储不同的权重值 ‌5.实现简洁‌:指针操作直观反映图结构 三、实现步骤解析 ‌定义边结构‌:创建包含目标顶点、边数据和next指针的边节点 ‌定义顶点结构‌:创建包含顶点数据和第一条边指针的顶点节点 ‌图类设计‌: 提供默认和指定大小的构造函数 维护顶点计数器 ‌核心操作实现‌: 添加边:在指定顶点的边链表中插入新边 添加顶点:设置顶点数据并增加计数 ‌辅助功能‌: 打印整个图的邻接表表示 四、完整代码和注释 C++ #include using namespACe std;

// 边结构体,表示图中的边 struct edge { int nextnum; // 边指向的顶点编号 int data; // 边存储的数据(如权重) edge* next=nullptr; // 指向下一条边的指针 };

// 顶点结构体,表示图中的顶点 struct listnode { int data; // 顶点存储的数据 edge* first=nullptr;// 指向第一条边的指针 };

// 图类,使用邻接表实现 class graph{ listnode* g; // 邻接表数组 int n = 0; // 顶点计数器

public: // 指定大小的构造函数 graph(int num){ g = new listnode[num]; // 分配顶点数组 }

// 默认构造函数(默认大小1001)
graph(){
    g = new listnode[1001];
}

// 添加边的方法
void addedge(int head, int tail, int data){
    edge* tmp = g[head].first; // 获取顶点的第一条边

    // 如果顶点没有边,直接添加为第一条边
    if (!tmp) {
        g[head].first = new edge;
        g[head].first->data = data;
        g[head].first->nextnum = tail;
    }
    else {
        // 否则遍历到边链表末尾添加新边
        while (tmp->next) 
            tmp = tmp->next;
        tmp->next = new edge;
        tmp->next->data = data;
        tmp->next->nextnum = tail;
    }
}

// 添加顶点的方法
void addnode(int k, int data){
    g[k].data = data; // 设置顶点数据
    n++;              // 增加顶点计数
}

// 打印图的邻接表表示
void print(){
    for (int i = 0;i < n;i++){
        cout << g[i].data << "->"; // 打印顶点数据
        edge* tmp = g[i].first;    // 获取第一条边

        // 遍历打印所有邻接边
        while (tmp) {
            cout << tmp->nextnum<<"("<<tmp->data << ")->";
            tmp = tmp->next;
        }
        cout <<"null"<< endl; // 边链表结束标记
    }
}

}; 五、总结 本文介绍了一种邻接表实现的图数据结构,通过详细的代码注释和分步解析,展示了图的基本操作实现。邻接表在表示稀疏图时具有明显的空间优势,适合处理顶点多但边相对少的图结构。理解这种实现方式对于学习图算法和网络分析有重要意义。

转载:邻接表实现指南:图结构的链表存储方式

点赞
收藏
评论区
推荐文章
小天 小天
2年前
图数据库简介
概况图数据库(Graphdatabase,GDB)是一个使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。该系统的关键概念是图,它直接将存储中的数据项,与数据节点和节点间表示关系的边的集合相关联。图形数据库应用场景非常
似梦清欢 似梦清欢
2年前
线性表
线性表的顺序存储实现(数组形式)称为顺序表。线性表顺序表示原理解析这里描述的线性表是逻辑结构的,独立于存储结构。线性表的顺序表示简称顺序表。顺序表实现线性表的方式是使用数组。线性表第一个元素的数组下标是0。另外一种实现顺序表的方法:使用数组方式比动态分配更
Stella981 Stella981
3年前
Python绘制拓扑图(无向图)、有向图、多重图。最短路径计算
前言:数学中,“图论”研究的是定点和边组成的图形。计算机中,“网络拓扑”是数学概念中“图”的一个子集。因此,计算机网络拓扑图也可以由节点(即顶点)和链路(即边)来进行定义和绘制。延伸:无向图两个节点之间只有一条线相连接,且没有方向。 有向图两个节点之间只有一条线相连接,且有方向。方向可以单向,也可以双向。 多重图两个节点之
Stella981 Stella981
3年前
Neo4j 第一篇:在Windows环境中安装Neo4j
<divid"cnblogs\_post\_body"class"blogpostbody"<p图形数据库(GraphDatabase)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和
Stella981 Stella981
3年前
GraphLab与Pregel对比
一、GraphLab示例1:GraphLab完成对V0邻接顶点的求和计算!(http://static.oschina.net/uploads/img/201511/01234613_w53B.png)示例中,需要完成对V0邻接顶点的求和计算,串行实现中,V0对其所有的邻接点进行遍历,累加求和。而GraphLab中,将顶
Wesley13 Wesley13
3年前
C语言实现数据结构的邻接矩阵
写在前面  图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法。            另一种是基于链表的的邻接表表示法。  在邻接矩阵中,可以如下表示顶点和边连接关系:    !(https://oscimg.oschina.net/oscnet/fe38c2aff8c2a62f0d7ab71f55c1eb1cea
Wesley13 Wesley13
3年前
D1
1\.数据结构  1.1线性结构  (1)最常用的数据结构,特点是数据元素之间存在一对一的线性关系  (2)有两种不同的存储结构,即顺序存储结构和链式存储结构    顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的    链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
Stella981 Stella981
3年前
HugeGraph图数据库各类索引功能对比
HugeGraphDatabaseIndexHugeGraph图数据库的索引支持比较全面,图数据库的索引一般包括几方面:图索引/边索引(graphindex):主要用于加速获取顶点的关联边,一般使用邻接表或十字链表等方式,也可以使用hash索引。hugegraph使用的是邻接表。超级点索引(vertexcentricind
菜园前端 菜园前端
2年前
什么是图?
原文链接:什么是图?图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在JavaScript中没有图,但是可以通过Object和Array来构建图。常用操作深度优先遍历广度优先遍历图的表示法邻接矩阵邻接表关联矩阵...
贾蔷 贾蔷
4小时前
牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)
一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历