数据结构 图的邻接表

数据结构 图的邻接表呃,下面该写邻接表了…….邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。邻接表为了避免内存的浪费引入了链式存储,它的处理办法是: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)……

 

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

 

数据结构 图的邻接表

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C++编程语言中重载运算符(operator)介绍「建议收藏」

    C++编程语言中重载运算符(operator)介绍「建议收藏」本文主要介绍在C++编程语言中使用关键字operator重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字operator重载运算符的具体方法。1概述1.1Whatoperator是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和待重载的运算符整体(如operator=)视为一个函数名。使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运

  • Java中数组的定义与使用(一)「建议收藏」

    Java中数组的定义与使用(一)「建议收藏」如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:inti1,i2,i3,…i100;但是这儿时候如果按照此类方式定义就会非常麻烦,…

  • git切换远程分支然后怎么拉取(从远程拉取分支到本地分支)

    Git拉取远程分支到本地本地新建一个空白文件夹folder;进入folder目录,打开gitbash,用命令行初始化git仓库;$gitinit3.与远程仓库建立连接;//`http://xxx…`该网址为远程仓库`Game`的ip地址,可在远程仓库`Game`中进行查看$gitremoteaddoriginhttp://192.168.22.88:8000/102840/Game.git拉取远程分支到本地;//`cs`替换为远程分支名$gitf

  • python中 列表(List)转换为字符串(Str)的方法

    python中 列表(List)转换为字符串(Str)的方法1、List列表转为Str字符串List中存的是字符串的时候,一般是通过.join()函数去转换:例:dataList=[‘1′,’2′,’3′,’4’]str1=“,”+join(dataList)print(dataList)…

  • Linux stat函数_c++ stringbuffer

    Linux stat函数_c++ stringbuffer之前写过一篇关于stat命令的博客,介绍了stat命令的使用和输出信息表示,今天又见到了stat函数,因为输出原因,准备整理一下。stat函数介绍  根据《UNIX环境高级编程》中对于stat函数的解释,stat函数和stat命令一样,都是返回该文件的详细信息。函数定义为:#include&lt;sys/types.h&gt;#include&lt…

  • 20那天android得知

    20那天android得知

发表回复

您的电子邮箱地址不会被公开。

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