C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出

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

目录

1.邻接表相关知识补充

 2. 图的邻接存储表示

3.测试输入与输出样例

4.代码实现

4.1 创建无向图邻接表

4.2 输入无向图的邻接表


1.邻接表相关知识补充

定义:

对于图中每个顶点 vi,把所有邻接于 vi的顶点(对有向图是将从vi出发的弧的弧头顶点链接在一起)链接成一个带头结点的单链表,将所有头结点顺序存储在一个一维数组中。

示例:下面左图G2对应的邻接表如右边所示。

构造无向图的邻接表,# C/C++实现算法,算法,数据结构,c语言,c++

 2. 图的邻接存储表示

#define MAXVEX 20 /*最大顶点数*/
typedef enum{DG,DN,UDG,UDN} GraphKind; /*有向图,有向网,无向图,无向网*/
typedef struct ENode /*表结点类型*/
{
    int adjvex;
    struct ENode *nextarc;
    int weight;
}ENode;
typedef int VexType;
typedef struct VNode /*头结点类型*/
{
    VexType vex;
    ENode *firstarc;
}VNode, AdjList[MAXVEX]; /*邻接表类型定义*/
typedef struct
{
    AdjList vertices; /*用邻接表存储顶点集合及边集合*/
    int vexnum,edgenum;
    GraphKind kind;
}ALGraph; /*邻接表存储的图的类型定义*/

3.测试输入与输出样例

测试输入:

2 5 6

0 1 0 3 1 2 1 4 2 3 2 4

预期输出:

0->3->1

1->4->2->0

2->4->3->1

3->2->0 4->2->1

4.代码实现

这里主要写了两个函数,一个用于生成无向图的邻接表,一个用于输出其邻接表

4.1 创建无向图邻接表

void CreateUDG_ALG(ALGraph &g) /*构造无向图的邻接表*/
{
    int kind,dot,edges;
    scanf("%d %d %d",&kind,&dot,&edges);
    g.vexnum=dot;g.edgenum=edges;g.kind=(GraphKind)kind;
/*这里有关枚举的类型再赋值问题(g.kind),枚举变量的再赋值不能直接是数字,如果是数字的话需要一个枚举/类型的强制转换*/
    VNode*pn=NULL;
    for(int i=0;i<dot;i++) //创建六个头结点
    {
        pn=new VNode;
        pn->vex=i;// VexType类型就是int类型
        pn->firstarc=NULL;//初始化置空
        g.vertices[i]=*pn;   //vertices数组类型是头结点类型
    }
    int x,y;
    ENode *en=NULL;ENode *tn=NULL; //都是边结点类型
    for(int j=0;j<edges;j++) //6个变,所以循环6次 开始创建邻接表
    {
        en= new ENode;    //边结点指针
        // scanf("%d",&x);  //第一个点
        // scanf("%d",&y);  //第二个点
        scanf("%d%d",&x,&y);  //也可以写在一起

        //将输入的信息添加到边结点上去,采用链表头插法的方式不停改变我们的指针
        en->adjvex=y;en->weight=0;en->nextarc=g.vertices[x].firstarc;
        g.vertices[x].firstarc=en;

        //下面这段代码也是一样的,采用链表头插法的方式        
        tn= new ENode;    //边结点指针
        tn->adjvex=x;tn->weight=0;tn->nextarc=g.vertices[y].firstarc;
        g.vertices[y].firstarc=tn;
    } 
}

4.2 输入无向图的邻接表

void PrintAdjList(ALGraph g) /*输出邻接表*/
{
    ENode *sn;//定义一个边结点指针,用于移动改变输出的边结点
    for(int i=0;i<g.vexnum;i++)
    {
        sn=g.vertices[i].firstarc;//初始化为每个顶点的第一条边的地址
        printf("%d",i);
        while(sn!=NULL)//循环输出我们的每个顶点的边结点信息
        {
            printf("->%d",sn->adjvex);

//每输出完一个边结点就移动至下一个边结点,直到最后一个边结点为止,也就是指针为空的时候
            sn=sn->nextarc;
        }
        printf("\n");//完成一个顶点的全部边结点输出后,换行
    }
}

整体就是采用循环的方式,头插法创建我们的无向图的邻接表,关键在于其中我们指针的移动。文章来源地址https://www.toymoban.com/news/detail-754975.html

到了这里,关于C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 24考研数据结构-图的存储结构邻接矩阵

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

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

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

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

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

    2024年02月20日
    浏览(36)
  • 数据结构--5.1图的存储结构(十字链表、邻接多重表、边集数组)

    目录 一、十字链表(Orthogonal List) 二、邻接多重表 三、边集数组 四、深度优先遍历   重新定义顶点表结点结构:  data firstIn firstOut 重新定义边表结构结点: tailVex headVex headLink tailLink        十字链表的好处就是因为把邻接表和逆邻接表整合在了一起,这样既容易找到Vi为

    2024年02月10日
    浏览(31)
  • 【数据结构】图的创建(邻接矩阵,邻接表)以及深度广度遍历(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日
    浏览(34)
  • 数据结构图 算法6.1-6.2创建无向网 算法6.4-6.6DFS

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Time of completion:2022.12.6 Last edited: 2022.12.6 任务描述 本关任务:编写一个能输出无向图邻接矩阵的小程序。 相关知识 为了完成本关任务,你需要掌握:1.创建邻接矩阵 编程要求 根据提示,在右侧编辑器

    2024年02月03日
    浏览(32)
  • 对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

    目录 一 实验目的 二 实验内容及要求 实验内容: 实验要求: 三 实验过程及运行结果 一 算法设计思路 二 源程序代码 三、截图 四 调试情况、设计技巧及体会 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优

    2024年02月04日
    浏览(44)
  • 数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)

    目录 邻接矩阵 图节点的结构 创建并初始化 插入边 完整的图的建立  邻接表 图节点的结构 创建并初始化 插入边  完整的图的建立  定义结构体GNode,其中包含以下成员变量: Nv:表示图中的顶点数。 Ne:表示图中的边数。 二维数组表示图的邻接矩阵。它的大小是MaxVertexN

    2024年02月06日
    浏览(36)
  • 数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    利用邻接矩阵存储无向图,并从0号顶点开始进行深度优先遍历。 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示图中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入图中。 例如: 4 4 0 1 1 3 0 3 0 2 先输出存储

    2024年02月09日
    浏览(54)
  • [数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)

    目录 前言 已完成内容 图深度优先遍历实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-AdjMatrixFunction.cpp 04-DFS.cpp 结语         此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的

    2023年04月10日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包