当前位置: 首页 > article >正文

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度

假设图G有n个顶点e条边,则存储该图需要O(n^2)

不适用稀疏图的存储

二.邻接表

1.邻接表的存储思想:

对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。

2.邻接表的结构定义

struct ArcNode{
    int adjvex;
    struct ArcNode *next;
};

template <class T>
struct VertexNode{
    T vertex;
    struct ArcNode *firstEdge;
};

邻接表的空间复杂度为O(n+e)

更适用于有向图的存储

3.无向图的邻接表

1.如何求顶点i的度?

顶点i的边表中结点的个数 

2.如何判断顶点vi和vj之间是否有边?

测试顶点vi的边表中是否有终点为j的结点

4.有向图的邻接表

1.如何求顶点i的出度?

顶点i的边表中结点的个数 

2.如何求顶点i的入度?

各顶点的出边表中以顶点i为终点的结点个数

5.网图的邻接表

三.邻接表存储有向图的类

struct ArcNode{
    int adjvex;
    struct ArcNode *next;
};

template <class T>
struct VertexNode{
    T vertex;
    struct ArcNode *firstEdge;
};
template <class T>
class ALGraph{
private:
    VertexNode<T> adjList[MAX_VERTEX];
    int vertexNum,arcNum;
public:
    ALGraph(T v[],int n,int e);
    ~ALGraph();
    void DFSTraverse();
    void BFSTraverse();
};

template <class T>
ALGraph<T>::ALGraph(T v[],int n,int e){
    int vi,vj;
    ArcNode *s;
    vertexNum=n;
    arcNum=e;
    for(int i=0;i<n;i++){
        adjList[i].vertex=v[i];
        adjList[i].firstEdge=NULL;
    }
    for(int i=0;i<arcNum;i++){
        cin>>vi>>vj;
        s=new ArcNode;
        s->adjvex=vj;
        s->next=adjList[vi].firstEdge;
        adjList[vi].firstEdge=s;
    }
}
template <class T>
ALGraph<T>::~ALGraph(){
    int i,j;
    ArcNode *p;
    for(i=0;i<vertexNum;i++){
        p=adjList[i].firstEdge;
        if(p){
            while(p){
                adjList[i].firstEdge=p->next;
                delete p;
                p=adjList[i].firstEdge;
            }
        }
    }
}

 

四.逆邻接表

对于邻接表来说,查找入度非常困难。

所以引入了逆邻接表。

五.十字链表 

十字链表的结点结构:

六.图的存储结构的比较


http://www.kler.cn/news/133830.html

相关文章:

  • 适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频
  • C++ 字符串的 拼接,插入,查找与截取。
  • 消息消费过程
  • CnosDB有主复制演进历程
  • main.js 中的 render函数
  • 几种典型的深度学习算法:(CNN、RNN、GANS、RL)
  • S32K324 UDS Bootloader开发-下位机篇-Bootload软件(2)
  • Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic
  • SELinux零知识学习十七、SELinux策略语言之类型强制(2)
  • 日志维护库:loguru
  • 图论| 827. 最大人工岛 127. 单词接龙
  • 运行ps显示msvcp140.dll丢失怎么恢复?msvcp140.dll快速解决的4个不同方法
  • react antd下拉选择框选项内容换行
  • js:react使用zustand实现状态管理
  • Shaderlab的组成部分SubShader
  • 分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测
  • C#中.NET 6.0 控制台应用通过EF访问新建数据库
  • 夺走的第一份工作竟是OpenAI CEO?
  • Linux文件和文件夹命令详解
  • MIB 6.1810实验Xv6 and Unix utilities(2)sleep
  • 九、Linux用户管理
  • Windows安装多个版本的Java
  • vue.js javascript js判断是值否为空
  • 庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片
  • 八股文-TCP的三次握手
  • C++-特殊类和单例模式
  • Leetcode—142.环形链表II【中等】
  • 基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】
  • 将AI技术与VR元宇宙相结合的整体解决方案
  • 【Redis】zset常用命令集合间操作内部编码使用场景