图的存储结构——邻接表法

一、邻接表

​ 由顶点表和边表构成,顶点表由顶点域(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);
}

图的存储结构——邻接表法相关推荐

  1. 7.2图的存储结构(邻接表)

    为什么要采用邻接表: 对于边数相对顶点较少的图,这种结构无疑是存储空间的极大浪费. 所以把数组和链表结合起来存储,这种方式在图结构中适用,称为邻接表(AdjacencyList) 邻接表的处理方法如下 ...

  2. 图的存储结构---邻接表

    1. 邻接表(无向图) 对于边数相对顶点较少的图,可采取邻接表. 把数组与链表结合在一起来存储,这种方式在图结构也适用,称为邻接表(AdjacencyList). 2. 邻接表(有向图) 以每个顶点出 ...

  3. 【数据结构】图的存储结构—邻接表

    目录 什么是邻接表? 邻接表:定义 邻接表:相关类 邻接表:基本操作 1)创建无向网 2)创建有向网 3)顶点定位 4)插入边 5)第一个邻接点 6)查询下一个邻接点 小试牛刀 对比邻接表与邻接矩阵

  4. 图的存储 邻接矩阵+邻接表+链式前向星

    图的存储 - 邻接矩阵 在树的问题中,邻接矩阵是空间.时间的极大浪费. 假设树的结点个数为 N = 100000. 建立邻接矩阵需要空间为 1e5*1e5 但是由于只有 N - 1 条边,所以在邻接矩 ...

  5. 20.0、C语言数据结构——图的存储结构

    20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...

  6. 数据结构考研笔记(十五)——图的存储结构邻接矩阵、邻接表、十字链表、临界多重表的概念

    图的存储结构 1.邻接矩阵 1.1有向图 1.2无向图 2.邻接表法 2.1有向图边表 2.2无向图边表 3.十字链表 4.临界多重表 十字链表与临界多重表 1.邻接矩阵 邻接矩阵法结点数为n的图G ...

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

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

  8. 数据结构之图的存储结构:邻接矩阵法

    图的存储结构:邻接矩阵法 邻接矩阵法: 邻接矩阵的定义: 邻接矩阵存储无向图: 邻接矩阵存储有向图: 邻接矩阵存储网: 邻接矩阵法的性质: 邻接矩阵法的代码实现: 矩阵运算A的n次幂的含义: 性能分析 ...

  9. 【图】什么是图?无向图怎么存储?邻接表和邻接矩阵如何用代码存储图?

    目录 一.概念 图是什么 各种图的定义 二.图的存储结构 邻接矩阵 邻接表 三.代码实现图的存储 1.无向图存储 2.邻接矩阵存储图 核心代码 完整代码 3.邻接表存储有向图(不含权重) 核心代码 完 ...

最新文章

  1. android工程混淆和反编译
  2. jquery隐藏表格行
  3. codewars068 - Convert string to camel case
  4. css美化单选款、复选框
  5. C++读写EXCEL文件方式比较 .
  6. 查询存在表1但不存在表2的所有数据
  7. Node.js v7 Beta版引入citgm
  8. ahjesus C# 4.0 Parallel 并行运算
  9. java fx输出_JavaFX中具有输入和输出参数的并发后台任务或服务
  10. 飞猪:国庆乡村民宿订单量涨560% 00后红色旅游订单量同比涨80%
  11. cocos2dx 回调函数
  12. 结构体含有指针的写入文件
  13. 深入理解JVM虚拟机读书笔记——垃圾回收器
  14. 微信自动回复 html 点击文字,【微信开发】公众号自动回复文字和图文链接(示例代码)...
  15. 开发3dMax插件的方法和应用
  16. 英语语法快速入门3--名词性从句(附思维导图)
  17. console接口(console接口定义)
  18. 开发中的技术选型调研总结
  19. 作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?
  20. C++ COM组件的编写

热门文章

  1. VMware | 装虚拟机后root默认密码
  2. POI中设置Excel单元格格式样式(居中,字体,边框,背景色、列宽、合并单元格等)
  3. Android10 SystemUI状态栏网络图标流程分析
  4. Calibre for Mac v5.29.0电子书阅读管理工具
  5. 线性代数1.3行列式的按行展开
  6. 51时钟含闹钟(可按键设置)
  7. ros 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。
  8. 计算机安装win10配置,win11发布了,那么安装win11配置要求是什么?win11配置要求详解...
  9. 阿里Java程序员分享自己的职业规划,希望对你有所启发
  10. numpy.argsort()函数