图的存储结构——邻接表法
图的存储结构——邻接表法
一、邻接表
由顶点表和边表构成,顶点表由顶点域(data)和指向第一条邻接边的指针(firstarc)构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边的指针域(next)构成。
二、代码实现
(1)图的邻接表存储结构定义
#define MaxVertexNum 30
typedef char VertexType;
typedef int ArcValue;// 边表 结点
typedef struct ArcNode {int adjvex; //邻接结点,该顶点对应的下标ArcValue value; //权值struct ArcNode* next; //链域指向下一个结点
}ArcNode;//顶点表结点
typedef struct VertexNode {VertexType data; //存储 顶点的数据ArcNode* firstarc; //边表头指针
}VertexNode,AdjList[MaxVertexNum];//邻接表
typedef struct graph {AdjList adjList; //邻接表 数组int verNum, arcNum; //当前定点数、边数
}GraphAdjList;
(2)创建邻接表
创建顶点表及边表,如若为有向图,结点只插入一次。无向图则插入两次,顶点为双向关联。
void CreateAdjListGraph(GraphAdjList* G) {printf("有向图 1,无向图0:");int flag = 0;scanf("%d", &flag);//初始化邻接表for (int i = 0; i < MaxVertexNum; i++) {G->adjList[i].firstarc = NULL;}printf("输入顶点、边个数(空格间隔):");scanf("%d%d", &G->verNum, &G->arcNum);/*建立顶点表*/for (int i = 0; i < G->verNum; i++) {printf("请输入第%d个顶点的元素:", i + 1);fflush(stdin);scanf(" %c", &G->adjList[i].data);G->adjList[i].firstarc = NULL;}/*建立边表*/int vi, vj;ArcValue value;for (int i = 0; i < G->arcNum; i++) {printf("请输入vi vj w(空格间隔):");scanf("%d%d%d", &vi, &vj, &value);ArcNode* newNode;newNode = (ArcNode*)malloc(sizeof(ArcNode));newNode->next = G->adjList[vi - 1].firstarc;newNode->adjvex = vj;newNode->value = value;G->adjList[vi - 1].firstarc = newNode;if (flag==0) {//判断是否为有向图ArcNode* newNode2;newNode2 = (ArcNode*)malloc(sizeof(ArcNode));newNode2->next = G->adjList[vj - 1].firstarc;newNode2->adjvex = vi;newNode2->value = value;G->adjList[vj - 1].firstarc = newNode2;}}
}
(3)打印输出邻接表
void PrintGraphVertex(GraphAdjList* G) {printf("结点:\n");for (int i = 0; i < G->verNum; i++) {printf("%d\t%c\t", i+1, G->adjList[i].data);ArcNode* p = G->adjList[i].firstarc;while (p!=NULL) {printf("(%d,%d)\t", p->adjvex,p->value);p = p->next;}if (p==NULL) {printf("^");}printf("\n\n");}
}
三、完整代码
#include<stdio.h>
#include<stdlib.h>#define MaxVertexNum 30
typedef char VertexType;
typedef int ArcValue;// 边表 结点
typedef struct ArcNode {int adjvex; //邻接结点,该顶点对应的下标ArcValue value; //权值struct ArcNode* next; //链域指向下一个结点
}ArcNode;//顶点表结点
typedef struct VertexNode {VertexType data; //存储 顶点的数据ArcNode* firstarc; //边表头指针}VertexNode,AdjList[MaxVertexNum];//邻接表
typedef struct graph {AdjList adjList; //邻接表 数组int verNum, arcNum; //当前定点数、边数
}GraphAdjList;void CreateAdjListGraph(GraphAdjList* G) {printf("有向图 1,无向图0:");int flag = 0;scanf("%d", &flag);for (int i = 0; i < MaxVertexNum; i++) {G->adjList[i].firstarc = NULL;}printf("输入顶点、边个数(空格间隔):");scanf("%d%d", &G->verNum, &G->arcNum);/*建立顶点表*/for (int i = 0; i < G->verNum; i++) {printf("请输入第%d个顶点的元素:", i + 1);fflush(stdin);scanf(" %c", &G->adjList[i].data);G->adjList[i].firstarc = NULL;}/*建立边表*/int vi, vj;ArcValue value;for (int i = 0; i < G->arcNum; i++) {printf("请输入vi vj w(空格间隔):");scanf("%d%d%d", &vi, &vj, &value);ArcNode* newNode;newNode = (ArcNode*)malloc(sizeof(ArcNode));newNode->next = G->adjList[vi - 1].firstarc;newNode->adjvex = vj;newNode->value = value;G->adjList[vi - 1].firstarc = newNode;if (flag==0) {ArcNode* newNode2;newNode2 = (ArcNode*)malloc(sizeof(ArcNode));newNode2->next = G->adjList[vj - 1].firstarc;newNode2->adjvex = vi;newNode2->value = value;G->adjList[vj - 1].firstarc = newNode2;}}}void PrintGraphVertex(GraphAdjList* G) {printf("结点:\n");for (int i = 0; i < G->verNum; i++) {printf("%d\t%c\t", i+1, G->adjList[i].data);ArcNode* p = G->adjList[i].firstarc;while (p!=NULL) {printf("(%d,%d)\t", p->adjvex,p->value);p = p->next;}if (p==NULL) {printf("^");}printf("\n\n");}
}int main() {GraphAdjList* G;G = (GraphAdjList*)malloc(sizeof(GraphAdjList));CreateAdjListGraph(G);PrintGraphVertex(G);
}
图的存储结构——邻接表法相关推荐
- 7.2图的存储结构(邻接表)
为什么要采用邻接表: 对于边数相对顶点较少的图,这种结构无疑是存储空间的极大浪费. 所以把数组和链表结合起来存储,这种方式在图结构中适用,称为邻接表(AdjacencyList) 邻接表的处理方法如下 ...
- 图的存储结构---邻接表
1. 邻接表(无向图) 对于边数相对顶点较少的图,可采取邻接表. 把数组与链表结合在一起来存储,这种方式在图结构也适用,称为邻接表(AdjacencyList). 2. 邻接表(有向图) 以每个顶点出 ...
- 【数据结构】图的存储结构—邻接表
目录 什么是邻接表? 邻接表:定义 邻接表:相关类 邻接表:基本操作 1)创建无向网 2)创建有向网 3)顶点定位 4)插入边 5)第一个邻接点 6)查询下一个邻接点 小试牛刀 对比邻接表与邻接矩阵
- 图的存储 邻接矩阵+邻接表+链式前向星
图的存储 - 邻接矩阵 在树的问题中,邻接矩阵是空间.时间的极大浪费. 假设树的结点个数为 N = 100000. 建立邻接矩阵需要空间为 1e5*1e5 但是由于只有 N - 1 条边,所以在邻接矩 ...
- 20.0、C语言数据结构——图的存储结构
20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...
- 数据结构考研笔记(十五)——图的存储结构邻接矩阵、邻接表、十字链表、临界多重表的概念
图的存储结构 1.邻接矩阵 1.1有向图 1.2无向图 2.邻接表法 2.1有向图边表 2.2无向图边表 3.十字链表 4.临界多重表 十字链表与临界多重表 1.邻接矩阵 邻接矩阵法结点数为n的图G ...
- 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)
目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...
- 数据结构之图的存储结构:邻接矩阵法
图的存储结构:邻接矩阵法 邻接矩阵法: 邻接矩阵的定义: 邻接矩阵存储无向图: 邻接矩阵存储有向图: 邻接矩阵存储网: 邻接矩阵法的性质: 邻接矩阵法的代码实现: 矩阵运算A的n次幂的含义: 性能分析 ...
- 【图】什么是图?无向图怎么存储?邻接表和邻接矩阵如何用代码存储图?
目录 一.概念 图是什么 各种图的定义 二.图的存储结构 邻接矩阵 邻接表 三.代码实现图的存储 1.无向图存储 2.邻接矩阵存储图 核心代码 完整代码 3.邻接表存储有向图(不含权重) 核心代码 完 ...
最新文章
- android工程混淆和反编译
- jquery隐藏表格行
- codewars068 - Convert string to camel case
- css美化单选款、复选框
- C++读写EXCEL文件方式比较 .
- 查询存在表1但不存在表2的所有数据
- Node.js v7 Beta版引入citgm
- ahjesus C# 4.0 Parallel 并行运算
- java fx输出_JavaFX中具有输入和输出参数的并发后台任务或服务
- 飞猪:国庆乡村民宿订单量涨560% 00后红色旅游订单量同比涨80%
- cocos2dx 回调函数
- 结构体含有指针的写入文件
- 深入理解JVM虚拟机读书笔记——垃圾回收器
- 微信自动回复 html 点击文字,【微信开发】公众号自动回复文字和图文链接(示例代码)...
- 开发3dMax插件的方法和应用
- 英语语法快速入门3--名词性从句(附思维导图)
- console接口(console接口定义)
- 开发中的技术选型调研总结
- 作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?
- C++ COM组件的编写
热门文章
- VMware | 装虚拟机后root默认密码
- POI中设置Excel单元格格式样式(居中,字体,边框,背景色、列宽、合并单元格等)
- Android10 SystemUI状态栏网络图标流程分析
- Calibre for Mac v5.29.0电子书阅读管理工具
- 线性代数1.3行列式的按行展开
- 51时钟含闹钟(可按键设置)
- ros 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。
- 计算机安装win10配置,win11发布了,那么安装win11配置要求是什么?win11配置要求详解...
- 阿里Java程序员分享自己的职业规划,希望对你有所启发
- numpy.argsort()函数