数据结构之邻接表

这篇具有很好参考价值的文章主要介绍了数据结构之邻接表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


邻接表是一种表示图的数据结构,它通过链表的形式,将每个节点的邻居节点记录下来。具体原理如下:

  1. 对于每个节点,我们创建一个链表。链表中存储该节点所连接的所有边的信息。

  2. 对于每条边,我们在两个节点之间的链表中分别存储该边的信息。例如,如果节点A和节点B之间有一条边,我们会在节点A的链表中存储一条指向节点B的边,同时在节点B的链表中存储一条指向节点A的边。

  3. 通过邻接表,我们可以轻松地获取任意节点的邻居节点列表。只需访问该节点的链表即可。同时,我们也可以方便地实现图的遍历和搜索算法,如深度优先搜索和广度优先搜索。

邻接表相对于邻接矩阵,可以更好地处理稀疏图(即边数相对于节点数很小的图),因为邻接矩阵需要存储所有节点之间的连通情况,当图的边数远小于节点数时,会浪费很多空间。
邻接表,数据结构与算法,数据结构

一、C 语言实现邻接表及源码详解

邻接表是一种常用的图的表示方法,可以用来存储无向图和有向图。C语言可以通过结构体和指针来实现邻接表,以下是一个简单的示例代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 20

// 边表结点
typedef struct ArcNode {
    int adjvex;  // 该边所指向的顶点的位置
    struct ArcNode *next;  // 指向下一条边的指针
} ArcNode;

// 顶点表结点
typedef struct VertexNode {
    int data;  // 顶点的数据
    ArcNode *firstarc;  // 指向第一条边的指针
} VertexNode;

// 邻接表结构
typedef struct {
    VertexNode vertex[MAX_VERTEX_NUM];  // 顶点表
    int vexnum;                         // 顶点数
    int arcnum;                         // 边数
} Graph;

// 创建邻接表
void CreateGraph(Graph *G) {
    printf("请输入顶点数和边数:");
    scanf("%d %d", &(G->vexnum), &(G->arcnum));
    getchar();

    printf("请输入各顶点的值:");
    for (int i = 0; i < G->vexnum; i++) {
        scanf("%d", &(G->vertex[i].data));
        G->vertex[i].firstarc = NULL;
    }
    getchar();

    printf("请输入各边的顶点序号(如:3 5):\n");
    for (int i = 0; i < G->arcnum; i++) {
        int v1, v2;
        scanf("%d %d", &v1, &v2);
        ArcNode *arc1 = (ArcNode *)malloc(sizeof(ArcNode));
        arc1->adjvex = v2;
        arc1->next = G->vertex[v1].firstarc;
        G->vertex[v1].firstarc = arc1;

        ArcNode *arc2 = (ArcNode *)malloc(sizeof(ArcNode));
        arc2->adjvex = v1;
        arc2->next = G->vertex[v2].firstarc;
        G->vertex[v2].firstarc = arc2;
    }
}

// 打印邻接表
void PrintGraph(Graph G) {
    printf("打印邻接表:\n");
    for (int i = 0; i < G.vexnum; i++) {
        printf("%d:", G.vertex[i].data);
        ArcNode *p = G.vertex[i].firstarc;
        while (p) {
            printf("%d ", G.vertex[p->adjvex].data);
            p = p->next;
        }
        printf("\n");
    }
}

// 主函数
int main() {
    Graph G;
    CreateGraph(&G);
    PrintGraph(G);
    return 0;
}

以上代码实现了邻接表的创建和打印,其中结构体 ArcNode 表示边表结点, VertexNode 表示顶点表结点, Graph 表示邻接表结构体。在 CreateGraph 函数中,通过循环输入各顶点的值和边的顶点序号,并利用指针连接边表和顶点表,最终构造出邻接表。在 PrintGraph 函数中,循环打印出每个顶点对应的边表。

邻接表,数据结构与算法,数据结构


二、C++ 语言实现邻接表及源码详解

邻接表是一种用于表示图的数据结构,它使用链表来表示每个顶点连接的边。C++语言中可以使用结构体和指针来实现邻接表,下面是一个简单的实现示例:

#include <iostream>
#include <vector>

using namespace std;

// 邻接表中每个节点的结构体
struct Node {
    int val; // 存储顶点的值
    Node* next; // 指向下一个节点
};

// 邻接表类
class AdjacencyList {
private:
    vector<Node*> graph; // 存储邻接表
public:
    AdjacencyList(int n) {
        graph.resize(n, nullptr); // 初始化邻接表
    }

    // 插入一条边
    void addEdge(int u, int v) {
        Node* node = new Node();
        node->val = v;
        node->next = graph[u];
        graph[u] = node;
    }

    // 打印邻接表
    void print() {
        for (int i = 0; i < graph.size(); i++) {
            Node* node = graph[i];
            cout << i << "->";
            while (node != nullptr) {
                cout << node->val << "->";
                node = node->next;
            }
            cout << "null" << endl;
        }
    }
};

int main() {
    AdjacencyList graph(5);
    graph.addEdge(0, 1);
    graph.addEdge(0, 4);
    graph.addEdge(1, 2);
    graph.addEdge(1, 3);
    graph.addEdge(1, 4);
    graph.addEdge(2, 3);
    graph.addEdge(3, 4);
    graph.print();
    return 0;
}

在这个实现中,我们定义了一个Node结构体,表示邻接表中的一个节点,包含该顶点的值val和指向下一个节点的指针next。我们还定义了AdjacencyList类来表示整个邻接表,其中使用一个vector数组来存储每个顶点的链表。

addEdge函数中,我们通过创建一个新的节点,将其插入到u节点的链表头部,表示uv之间存在一条边。

print函数中,我们遍历整个邻接表,对于每个顶点,遍历其链表并输出相邻的顶点。

邻接表,数据结构与算法,数据结构


三、Java 语言实现邻接表及源码详解

邻接表是一种表示图的数据结构,它将每个节点的相邻节点存储为一个链表。在 Java 中,我们可以使用集合和链表来实现邻接表。

以下是 Java 实现邻接表的代码:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class AdjacencyList {
    private List<List<Integer>> adjacencyList;

    public AdjacencyList(int numberOfNodes) {
        adjacencyList = new ArrayList<>(numberOfNodes);
        for (int i = 0; i < numberOfNodes; i++) {
            adjacencyList.add(new LinkedList<>());
        }
    }

    public void addEdge(int source, int destination) {
        List<Integer> sourceList = adjacencyList.get(source);
        sourceList.add(destination);

        List<Integer> destinationList = adjacencyList.get(destination);
        destinationList.add(source);
    }

    public List<Integer> getAdjacentNodes(int node) {
        return adjacencyList.get(node);
    }
}

在这个实现中,我们使用了一个 List 嵌套 List 的数据结构。从行的角度来看,我们将每个节点储存在主列表中。从列的角度来看,我们将每个节点的相邻节点储存在该节点的子列表中。

在构造函数中,我们初始化主列表,使其包含指定数量的节点,并为每个节点创建一个空子列表。在 addEdge() 方法中,我们将一条边添加到邻接表中。具体来说,我们将目标节点添加到源节点的子列表中,并将源节点添加到目标节点的子列表中。这个步骤是必需的,因为图是无向的,所以每条边都可以双向通行。

最后,在 getAdjacentNodes() 方法中,我们返回指定节点的子列表,它包含了该节点的所有相邻节点。

邻接表有许多用途,例如在图遍历算法中,它可以帮助我们查找每个节点的相邻节点。它还可以用于表示稀疏的图,因为它只存储相邻节点,而不是所有节点的组合。文章来源地址https://www.toymoban.com/news/detail-787350.html

到了这里,关于数据结构之邻接表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】邻接矩阵和邻接图的遍历

    本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。 本文的行文思路: 学习图的基本概念 学习图的存储结构——本文主要介绍邻接矩阵和邻接表 对每种结构进行深度优先遍历和广度优先遍历 话不多说,狠活献上 等等,先别急,正式学习之前先认识几个

    2024年02月04日
    浏览(52)
  • 数据结构——图的基本定义以及图的存储结构,邻接矩阵,邻接表

    目录 图的定义和术语 图的存储结构 顺序存储结构—邻接矩阵 链式存储结构 邻接表 邻接多重表 十字链表 图的遍历 图的连通性问题 有向无环图及其应用 最短路径 图的定义:图是一种非线性的复杂的数据结构,图中的数据元素的关系是多对多的关系 ,在图中我们常常把数

    2024年02月04日
    浏览(58)
  • C++数据结构之图的存储结构——邻接矩阵和邻接表实现无向图

    关键点: 1.构建二维数组 2.对应边的位置赋值为1 由于比较简单就直接上代码: 个人对邻接表实现无向图的理解如下,仅供参考:         由于无向图的组成是由多个顶点和多条无向边组成的,因此我们可以把它拆分成两个结构,分别是顶点和无向边,又由于我们是使用

    2024年02月05日
    浏览(55)
  • 【数据结构】邻接矩阵法

    顶点用一维数组Vex表示,其中可存放较为复杂的信息(如下标),边表用二维数组Edge表示,存放边的信息(两顶点之间有直接相连的边为1,否则为0)。  如何求顶点的入度 、出度? 对于无向图  第 i 个节点的度: 该结点所在行列的非0元素个数 对于有向图  第i个节点的

    2024年02月12日
    浏览(60)
  • 数据结构之邻接表

    邻接表是一种表示图的数据结构,它通过链表的形式,将每个节点的邻居节点记录下来。具体原理如下: 对于每个节点,我们创建一个链表。链表中存储该节点所连接的所有边的信息。 对于每条边,我们在两个节点之间的链表中分别存储该边的信息。例如,如果节点A和节点

    2024年02月02日
    浏览(31)
  • 数据结构——图篇(邻接矩阵、邻接表、深度优先搜索、广度优先搜索)

    描述 图比树更为复杂,展现的是一种多对多的关系,图的结构是任意两个数据对象之间都可能存在某种特定的关系的数据结构 概念 顶点 : 基本介绍 顶点集合表示为V集合,要求图中顶点至少要有一个,即V集合不能为空集。通常使用|V|来表示顶点的个数,通常使用E(V)来表示

    2024年02月04日
    浏览(41)
  • 24考研数据结构-图的存储结构邻接矩阵

    【1】顶点的结点结构 ——————— | data | firstarc | ——————— data数据域:储存顶点vi firstarc链域:指向链表中第一个结点 【2】弧的结点结构 —————————— | adjvex | info | nextarc | —————————— adjvex邻接点域:与顶点vi邻接的点在图中的位置 info数据域

    2024年02月14日
    浏览(57)
  • 数据结构--图的存储邻接表法

    邻接矩阵: 数组实现的顺序存储,空间复杂度高,不适合存储稀疏图 邻接表: 顺序+链式存储 无向图: 边结点的数量是 2|E|, 整体空间复杂度为 O(|V| + 2|E|) 有向图: 边结点的数量是 |E|, 整体空间复杂度为 O(|V| + |E|) 图的邻接表表示方式并不唯一 color{red}图的邻接表表示方

    2024年02月16日
    浏览(47)
  • 数据结构-邻接矩阵的创建与遍历

    上篇文章已经介绍了邻接矩阵的具体作用与如果利用邻接矩阵寻找相邻顶点,这次介绍重点为邻接矩阵的创建与两种遍历方式 邻接矩阵的创建 其结构体需要能记录顶点、顶点数、边数及邻接矩阵,即 创建方式则为读入边数、顶点数即各边的两个顶点和权值 图的遍历 DFS(深

    2024年02月20日
    浏览(47)
  • 【数据结构】图的创建(邻接矩阵,邻接表)以及深度广度遍历(BFS,DFS)

    图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中: 顶点集合V = {x|x属于某个数据对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Path(x, y)}是顶点间关系的有穷集合,也叫 做边的集合。 完全图:在有n个顶点的无向图中,若有n * (n-1)/2条边,

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包