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


    目录

    1.邻接表相关知识补充

     2. 图的邻接存储表示

    3.测试输入与输出样例

    4.代码实现

    4.1 创建无向图邻接表

    4.2 输入无向图的邻接表


    1.邻接表相关知识补充

    定义:

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

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

     2. 图的邻接存储表示

    1. #define MAXVEX 20 /*最大顶点数*/
    2. typedef enum{DG,DN,UDG,UDN} GraphKind; /*有向图,有向网,无向图,无向网*/
    3. typedef struct ENode /*表结点类型*/
    4. {
    5. int adjvex;
    6. struct ENode *nextarc;
    7. int weight;
    8. }ENode;
    9. typedef int VexType;
    10. typedef struct VNode /*头结点类型*/
    11. {
    12. VexType vex;
    13. ENode *firstarc;
    14. }VNode, AdjList[MAXVEX]; /*邻接表类型定义*/
    15. typedef struct
    16. {
    17. AdjList vertices; /*用邻接表存储顶点集合及边集合*/
    18. int vexnum,edgenum;
    19. GraphKind kind;
    20. }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 创建无向图邻接表

    1. void CreateUDG_ALG(ALGraph &g) /*构造无向图的邻接表*/
    2. {
    3. int kind,dot,edges;
    4. scanf("%d %d %d",&kind,&dot,&edges);
    5. g.vexnum=dot;g.edgenum=edges;g.kind=(GraphKind)kind;
    6. /*这里有关枚举的类型再赋值问题(g.kind),枚举变量的再赋值不能直接是数字,如果是数字的话需要一个枚举/类型的强制转换*/
    7. VNode*pn=NULL;
    8. for(int i=0;i//创建六个头结点
    9. {
    10. pn=new VNode;
    11. pn->vex=i;// VexType类型就是int类型
    12. pn->firstarc=NULL;//初始化置空
    13. g.vertices[i]=*pn; //vertices数组类型是头结点类型
    14. }
    15. int x,y;
    16. ENode *en=NULL;ENode *tn=NULL; //都是边结点类型
    17. for(int j=0;j//6个变,所以循环6次 开始创建邻接表
    18. {
    19. en= new ENode; //边结点指针
    20. // scanf("%d",&x); //第一个点
    21. // scanf("%d",&y); //第二个点
    22. scanf("%d%d",&x,&y); //也可以写在一起
    23. //将输入的信息添加到边结点上去,采用链表头插法的方式不停改变我们的指针
    24. en->adjvex=y;en->weight=0;en->nextarc=g.vertices[x].firstarc;
    25. g.vertices[x].firstarc=en;
    26. //下面这段代码也是一样的,采用链表头插法的方式
    27. tn= new ENode; //边结点指针
    28. tn->adjvex=x;tn->weight=0;tn->nextarc=g.vertices[y].firstarc;
    29. g.vertices[y].firstarc=tn;
    30. }
    31. }

    4.2 输入无向图的邻接表

    1. void PrintAdjList(ALGraph g) /*输出邻接表*/
    2. {
    3. ENode *sn;//定义一个边结点指针,用于移动改变输出的边结点
    4. for(int i=0;i
    5. {
    6. sn=g.vertices[i].firstarc;//初始化为每个顶点的第一条边的地址
    7. printf("%d",i);
    8. while(sn!=NULL)//循环输出我们的每个顶点的边结点信息
    9. {
    10. printf("->%d",sn->adjvex);
    11. //每输出完一个边结点就移动至下一个边结点,直到最后一个边结点为止,也就是指针为空的时候
    12. sn=sn->nextarc;
    13. }
    14. printf("\n");//完成一个顶点的全部边结点输出后,换行
    15. }
    16. }

    整体就是采用循环的方式,头插法创建我们的无向图的邻接表,关键在于其中我们指针的移动。

  • 相关阅读:
    new Socket(host, port)阻塞解决
    vscode使用ssh连接远程Ubuntu服务器(记录)
    JavaScript---函数arguments参数直接获取的方式
    GBase 8s使用脚本自动创建和初始化实例
    科大讯飞发布讯飞星火 3.0;开源AI的现状
    图论第四天|127. 单词接龙、841. 钥匙和房间、463. 岛屿的周长
    Python 中 key 参数的含义及用法
    方案分享:F5机器人防御助企业应对复杂攻击
    磨损对输送带安全的影响
    Open CASCADE学习|视图
  • 原文地址:https://blog.csdn.net/weixin_63676550/article/details/128166717