数据结构 图的邻接表

数据结构 图的邻接表呃,下面该写邻接表了…….邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:1.用一个一维数组存储顶点,当然你也可以用单链表存储,2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针…

大家好,又见面了,我是你们的朋友全栈君。

呃,下面该写邻接表了…….

邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。

邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:

1.用一个一维数组存储顶点,当然你也可以用单链表存储,

2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针next存放该顶点的另一个邻接点,这样就可以把该顶点的所有邻接点串起来了。

下面是一个无向的网图:

数据结构 图的邻接表

邻接表中数据的存储图示如下(emmm,无向图果然没有有向图好画):

数据结构 图的邻接表

emmm,终于画完了,我来介绍下这个图

顶点表也就是个结构体数组,是存放顶点的结构,顶点表中有data元素,存放顶点信息  firstarc是一个边结构体表指针,存放邻接点的信息。

边表也是一个结构体,内有adivex元素,存放邻接点的下标,weight存放顶点与邻接点之间线的权重,next是边表结构体指针,存放该顶点的下一个邻接点,next就是负责将顶点的邻接点连起来。

看着上面的图慢慢理解吧!

下面则是代码部分:

#include <iostream>
using namespace std;

#define MAXVERTEX 100   //最大顶点数
typedef char vertextype;    //定义顶点的存储类型
typedef int arctype;    //定义边的权值类型

typedef struct ArcNode  //边表节点
{
    int adjvex; //邻接点域,存储该顶点对应的下标
    arctype wigth;  //用于存储权值
    struct ArcNode *next; //链域,指向下一个邻接点
}ArcNode;

typedef struct VertexNode   //顶点表节点
{
    vertextype data;    //存储顶点数据的信息
    ArcNode *firstarc;  //边表头指针
}VertexNode, AdjList[MAXVERTEX];

typedef struct
{
    AdjList adjlist;    //定义邻接表
    int numvertex;  //当前邻接表的顶点数
    int numarc; //当前邻接表的边数
}GraphAdjList;

//建立图的邻接表
void CreateAdjListGraph(GraphAdjList &G)
{
    ArcNode *e;
    cin >> G.numvertex; //输入当前图的顶点数
    cin >> G.numarc;    //输入当前图的边数
    for(int i = 0; i < G.numvertex; i++)    //建立顶点表
    {
        cin >> G.adjlist[i].data;   //输入顶点信息
        G.adjlist[i].firstarc = NULL;   //将表边指针置为空
    }
    for(int k = 0; k < G.numarc; k++)
    {
        int i, j, w;
        cin >> i >> j >> w; //输入边两边的顶点和边上的权重
        e = new ArcNode;   //创建一个表边节点指针
        e->adjvex = j;
        e->wigth = w;
        e->next = G.adjlist[i].firstarc;
        G.adjlist[i].firstarc = e;
        //因为是无向图,彼此相对称
        e = new ArcNode;   //创建一个表边节点指针
        e->adjvex = i;
        e->wigth = w;
        e->next = G.adjlist[j].firstarc;
        G.adjlist[j].firstarc = e;
    }
}

//打印邻接表
void PrintfGraphAdjList(GraphAdjList G)
{
    for(int i = 0; i < G.numvertex; i++)
    {
        ArcNode *p = G.adjlist[i].firstarc;
        cout << G.adjlist[i].data << '\t';
        while(p)
        {
            cout << p->adjvex << ' ' << p->wigth << '\t';
            p = p->next;
        }
        cout << endl;
    }
}
int main()
{
    GraphAdjList G;
    CreateAdjListGraph(G);
    PrintfGraphAdjList(G);
    return 0;
}

邻接表的时间复杂度:n为顶点数,e为边数 O(n + e)……

 

运行结果(根据上图的信息输入):

 

数据结构 图的邻接表

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153945.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 资源网站链接_资源库在线

    资源网站链接_资源库在线1.rpm包下载www.rpmfind.netftp://rpmfind.net/linux2.根据依赖的库文件,查找相应的rpm包https://pkgs.org/3.Cacti相关监控模板https://docs.cacti.net/templates4.percona各版本备份数据工具下载(innobackupex、xtrabackup等)https…

    2022年4月19日
  • leetcode-103二叉树的锯齿形层序遍历「建议收藏」

    leetcode-103二叉树的锯齿形层序遍历「建议收藏」给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层序遍历如下:[ [3], [20,9], [15,7]]/** * Definition for a binary tree node. * struct TreeNode { * int

    2022年8月8日
  • ArcGIS二次开发基础教程(09):叠加分析

    ArcGIS二次开发基础教程(09):叠加分析ArcGIS二次开发基础教程(09):叠加分析缓冲区分析的概念及原理请查看帮助文档http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/analysis-toolbox/how-buffer-analysis-works.htm缓冲区分析//实现对图层中所有点要素进行缓冲分析IGraphicsContainergraphicsConta…

    2022年7月23日
  • 算法系列之九:计算几何与图形学有关的几种常用算法(一)

    算法系列之九:计算几何与图形学有关的几种常用算法(一)我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是收获很多,特别是丢弃了多年的数学又重新回到了脑袋中,算是最大的收获吧。尽管已经毕业多年了,但是每次回顾这些算法的代码,都觉得内心十分澎湃,如果换成现在的我,恐怕再也不会有动力去做这些事情了。

    2022年11月3日
  • 读取QQ ClientKey C++版本[通俗易懂]

    读取QQ ClientKey C++版本[通俗易懂]不需要注入,读取QQClientKeyC++版本#include”stdafx.h”#include<string>#include<windows.h>#include<iostream>#include<WinInet.h>#pragmacomment(lib,”wininet.lib”)usingnamespaces…

    2022年10月22日
  • vbs代码如何使用Wscript调试

    vbs代码如何使用Wscript调试转自:vbs代码如何使用Wscript调试有些朋友用vbs写代码习惯用MsgBox输出,有时候一段代码调试完输出了一堆MsgBox,调完了还要删掉。遇到想要查看对象的情况更是累的不行…然而,一个编程语言怎么可能没有更好的调试方法,MsgBox写累了的时候试一下用wscript?wscript是Windows脚本宿主,它不需要在调用其属性和方法之前进行实例化,并且

    2022年5月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号