目录

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;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");//完成一个顶点的全部边结点输出后,换行}
}

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

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

  1. C语言 数据结构 图的邻接矩阵存储 基本操作(附输入样例和讲解)

    代码参照了严蔚敏.吴伟民编写的数据结构(C语言版). 部分内容参考了这位大佬: https://blog.csdn.net/jeffleo/article/details/53326648 所有代码采 ...

  2. C语言数据结构-创建链表的四种方法

    文章目录 0 结点类型: 1 不带头结点的头插入法创建链表. 2 不带头结点的未插入法创建链表. 3 创建带结点的头插入链表. 4 带头结点的尾插入法创建链表. 0 结点类型: typedef int ...

  3. oracle单表存储记录,oracle从各个表获得数据保存到另一个表

    oracle从各个表取得数据保存到另一个表 从各个表中取得数据保存另一个表中: CREATE VIEW PARAMETER_view AS WITH tall AS ( SELECT p.PI_NO, ...

  4. 数据结构与算法(7-1)图的存储(邻接矩阵、邻接表)

    目录 一.图的邻接矩阵 存储结构 总代码 二.网图的邻接矩阵 存储结构 总代码 三.图的邻接表 存储结构 1.顶点列表结构体 2.邻接顶点结构体 总代码 四.网图的邻接表 存储结构 1.顶点列表结构体 ...

  5. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

    邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visi ...

  6. java邻接图_Java数据结构 - 图(邻接表存储)

    邻接表 相比邻接矩阵,邻接表要更加节省空间. 邻接表存储 本文将介绍邻接表存储有向带权图.图的例子如下. 图 介绍一下邻接表 上面的图对应的邻接表如下图所示: 邻接表 前面的数组存储的是所有的顶点,每 ...

  7. C语言数据结构-第二章线性表-电大

    第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...

  8. mysql 修改单表导入大小_MySQL更改大库大表存储引擎方案

    一. 概述 检查库中myisam的表, sql如下: SELECT * FROM `tables` WHERE table_schema = 'UAR_STATISTIC' AND ENGINE = ...

  9. 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)

    目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...

最新文章

  1. Java小故事(一)
  2. 微信小程序之设置不同的顶部导航栏名称
  3. springboot 第四讲
  4. 【网络安全】xhCMS代码审计思路
  5. android 恶意广告,CheckPoint:Android恶意广告软件SimBad被下载近1.5亿次
  6. React中的状态管理---Mobx
  7. .NET6之MiniAPI(九):基于角色的身份验证和授权
  8. Python笔记-类的单例模式及重载打印
  9. STM32之串口例程
  10. html基础技术笔记
  11. vue项目中使用lib-flexible解决移动端适配
  12. datatable 参数详细说明
  13. IE浏览器降级详细教程
  14. 微信支付宝支付开发文档
  15. 360加固签名验证_360加固助手签名工具怎么用
  16. mysql数据库更新数据库语句_详解MySQL数据库之更新语句
  17. jQuery获取兄弟元素
  18. 对接飞鹅接口一直提示未注册
  19. iOS 仿钉钉文字水印
  20. 天翼云linux版本,天翼云Linux主机操作

热门文章

  1. 为什么计算机经典大头书老是看不进去?
  2. SpringBoot Mysql数据库与Java时间差8小时 UTC是全球标准时间 GMT%2B8是东八区,不能用UTC 否则Java时间与数据库时间会有8h时差 时区
  3. 基于JS+CSS+HTML的跨年春节3D烟花模拟器
  4. 羽绒服穿出既动人又不冻人的美丽
  5. Windows产品密钥
  6. 数学中的i可以用计算机按吗,数学在计算机中的应用
  7. 正则表达式匹配“不包含某些字符串”的技巧
  8. 区域医疗云his系统源码,具有可扩展、易共享、易协同的优势
  9. 教妹学Java(三十二):了解 Java 中的返回类型协变
  10. 我有两把枪,一把叫射,另一把叫啊!!手机可以玩英雄联盟手游了,重新拾起大学时代的记忆