首页 > 其他分享 >对于邻接表的认识和学习心得

对于邻接表的认识和学习心得

时间:2022-11-04 18:01:23浏览次数:47  
标签:struct 认识 Graph 学习心得 int V2 邻接 NewNode

存图的方式有两种:

一.邻接矩阵法(或关联矩阵)

就是一个简单的 整数型 二维数组。

二.邻接表法 (重点讲解)

它是一种顺序存储(结构体数组)和链式存储(链表)结合的存储方法,它由顶点表(结构体数组)边表(链表)两个相结合组成。

顶点表 结构体定义

 typedef struct Vnode
 {
   PtrToAdjVNode FirstEdge; // 存 边表表头 的指针
   int Date; // 存顶点的数据(如果这个点有带数据就开)一般用不上。
 }AdjList[MAXN];     // 顶点表 第下标i数组存的是 第i点的边表头指针

边表 结构体定义

 typedef struct AdjVNode *PtrToAdjVNode;
 struct AdjVNode
 {
   int AdjV; // 邻接点的下标
   int Weight; // 顶点到邻接点的 权重
   PtrToAdjVNode Next; // 指向下一个邻接点的指针
 };

对于 整个图 而言

 // 边的定义,输入 两点和其对应边的权重
 typedef struct ENode *PtrToENode;
 struct ENode
 {
   int V1,V2; // 如果是有向边,则<V1,V2> 表示 V1指向V2
   int Weight;   // 边的权重
 };
 typedef PtrToENode Edge;
 ​
 // 图的定义
 typedef struct GNode *PtrToGNode;
 struct GNode
 {
   int Nv;   // 图的点数
   int Ne;   // 图的边数
   AdjList G;   // 邻接表数组
 };
 typedef PtrToGNode LGraph;

20161212152019825

邻接表 可以统计每个点的出度,逆邻接表统计每个点的入度(出入度的大小就是链表的长度)

生成邻接表法如下

 LGraph CreateGraph(int VertexNum)  
 { // 初始化一个有 VertexNum 个顶点但没确定边数的图
     LGraph Graph;
     Graph = (LGraph)malloc(sizeof(struct GNode));
     Graph->Nv = VertexNum;  // 顶点数
     Graph->Ne = 0; // 边数
     for (int i = 0; i < Graph->Nv; i ++)  // 顶点编号从 0->N-1
         Graph->G[i].FirstEdge = NULL;// 图 的 顶点表结构体数组 的 边表结构体指针
     return Graph;
 }
 ​
 void InsertEdge(LGraph Graph, Edge E) // 图 和 边权结构体
 {
     PtrToAdjVNode NewNode;  // 插入边<V1,V2> ,为V2建立新的邻接点(在边表中)
     NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
     NewNode->AdjV = E->V2;
     NewNode->Weight = E->Weight;
     // 把V2邻接点的地址插入到V1的表头中(顶点表中存地址的 FirstEdge 中)
     NewNode->Next = Graph->G[E->V1].FirstEdge;
     Graph->G[E->V1],FirstEdge = NewNode;
     //把最新的V2地址保存在顶点表中,V2的下一个地址就是上一个V2的地址
     //相当于插入的邻接点排在边链表的后面
     
     // 如果是无向图,还需要重复上面操作,插入<v2,v1>
     PtrToAdjVNode NewNode;  // 插入边<V2,V1> ,为V1建立新的邻接点
     NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
     NewNode->AdjV = E->V1;
     NewNode->Weight = E->Weight;
     NewNode->Next = Graph->G[E->V2].FirstEdge;
     Graph->G[E->V2],FirstEdge = NewNode;
 }
 ​
 LGraph BuildGraph()   //生成一个图,用邻接表存
 {
     LGraph Graph;
     Edge E;
     int Nv;
     scanf("%d",&Nv);  // 输入顶点个数
     Graph = CreateGraph(Nv);
     scanf("%d",&Graph->Ne);  // 输入边数
     if (Graph->Ne) // 如果有边
    {
         E = (Edge)malloc(sizeof(struct ENode));
         for (int i = 0; i < Graph->Ne; i ++)
        {
             scanf("%d %d %d",&E->V1,&E->V2,&E->Weight);
             InsertEdge(Graph, E);
        }
    }
     return Graph;
 }

梳理一下: 用 邻接表方法 保存 一个图

用 BuildGraph() 函数,在该函数中,依次调用 CreateGraph() 生成一个有点无边 邻接表,InsertEgde() 把边关系和权值 插入邻接表的边表(链表)中。两个二级函数中,用到了最上面的四个结构体。 最后 BuildGraph() return了 Graph 就是一个完整的 邻接表。

额,,,还是要说一下,我写这些都是为了自己更好的理解,出发点不是为了讲解知识点,如果有人看见这篇文章请别当作学习参考。

标签:struct,认识,Graph,学习心得,int,V2,邻接,NewNode
From: https://www.cnblogs.com/littlekk/p/16858644.html

相关文章

  • 【学习心得】老男孩Linux课程学习分享,听听我的故事!
    我是老男孩教育Linux班的毕业学员,说一说我的学习感受。首先是费用方面,其实关于费用我没有什么想要说的,但很多小伙伴肯定都关注这点,所以简单分享一下。费用的话,其实......
  • 《SRE实战手册》学习笔记之认识SRE
    转载:https://www.cnblogs.com/imyalost/p/15889223.html前言我自己一直是专注在性能测试和稳定性保障领域的,因此买了很多相关的技术课程学习。极客时间上赵成老师的《SR......
  • Java实现【邻接矩阵、邻接表的创建、遍历(DFS,BFS)】+图解+完整代码
    1.思路图解兼样例:接下来将用此图例作为测试用例2.输出结果:(1)邻接矩阵:(2)邻接表:一、邻接矩阵importjava.util.ArrayList;importjava.util.Arrays;importjava.util.LinkedList......
  • 数据结构【完整代码】之(C语言实现【图的存储创建遍历】邻接矩阵与邻接表)
    零、编码前的准备1.构画草图:2.测试数据:邻接表的DFS与BFS测试数据:45ABCD0102031232邻接矩阵的DFS与BFS测试数据:45ABCD0150210031012153230一、邻接矩阵包含......
  • 全面认识快照(Snapshot)技术 copy保存
    什么是快照技术?快照技术主要是在操作系统以及存储技术上实现的一种记录某一时间系统状态的技术。近来,Oracle等数据库厂家以及Vmware等虚拟化产品也把这种技术引入各自......
  • C++ 不知树系列之认识二叉树(顺序、链表存储的实现)
    1.概念什么是二叉树?顾名思义,二叉树指树中的任何一个结点(除叶结点)的子结点不能多于2个。二叉树可分为:一般二叉树。只要符合二叉树的定义便可。满二叉树。满的意......
  • 第六章学习心得
    知识点归纳信号和信号处理;信号和中断的统一处理将信号视为进程中断,将进程从正常执行转移到信号处理信号的来源,包括来自硬件、异常和其他进程的信号信号在Unix/Linux......
  • Flask初步认识
    1.Flask基本认识Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展包(数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用Flask扩展加入ORM、窗体验......
  • 10月学习心得体会
    1、主要精力是在学习2门慕课,其中大数据技术完成第3-7章学习,实践练习只是完成部分。Spark基础编程,学习第2章部分内容。比预期进度慢,在搭建大数据开发环境上,在笔记本和台式机......
  • 学习心得 HDFS读数据过程
    HDFS读数据过程   第一步:打开文件。用Fliesystem先申明一个对象,然后生成一个子类DistributedFileSystem,这个时候生成FS的实例对象,其实是分布式文件系统HDFS的实例对象......