C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出
创始人
2024-03-15 18:04:26
0

目录

1.邻接表相关知识补充

 2. 图的邻接存储表示

3.测试输入与输出样例

4.代码实现

4.1 创建无向图邻接表

4.2 输入无向图的邻接表


1.邻接表相关知识补充

定义:

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

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

 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;ivex=i;// VexType类型就是int类型pn->firstarc=NULL;//初始化置空g.vertices[i]=*pn;   //vertices数组类型是头结点类型}int x,y;ENode *en=NULL;ENode *tn=NULL; //都是边结点类型for(int j=0;jadjvex=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%d",sn->adjvex);//每输出完一个边结点就移动至下一个边结点,直到最后一个边结点为止,也就是指针为空的时候sn=sn->nextarc;}printf("\n");//完成一个顶点的全部边结点输出后,换行}
}

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...