图的建立-邻接表表示(C语言)
代码如下:
/* 图的邻接表表示法 */#define MaxVertexNum 100 /* 最大顶点数设为100 */
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef char DataType; /* 顶点存储的数据类型设为字符型 *//* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{Vertex V1, V2; /* 有向边<V1, V2> */WeightType Weight; /* 权重 */
};
typedef PtrToENode Edge;/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{Vertex AdjV; /* 邻接点下标 */WeightType Weight; /* 边权重 */PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
};/* 顶点表头结点的定义 */
typedef struct Vnode{PtrToAdjVNode FirstEdge;/* 边表头指针 */DataType Data; /* 存顶点的数据 *//* 注意:很多情况下,顶点无数据,此时Data可以不用出现 */
} AdjList[MaxVertexNum]; /* AdjList是邻接表类型 *//* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{ int Nv; /* 顶点数 */int Ne; /* 边数 */AdjList G; /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */LGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */Vertex V;LGraph Graph;Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立图 */Graph->Nv = VertexNum;Graph->Ne = 0;/* 初始化邻接表头指针 *//* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */for (V=0; V<Graph->Nv; V++)Graph->G[V].FirstEdge = NULL;return Graph;
}void InsertEdge( LGraph Graph, Edge E )
{PtrToAdjVNode NewNode;/* 插入边 <V1, V2> *//* 为V2建立新的邻接点 */NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V2;NewNode->Weight = E->Weight;/* 将V2插入V1的表头 */NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;/* 若是无向图,还要插入边 <V2, V1> *//* 为V1建立新的邻接点 */NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V1;NewNode->Weight = E->Weight;/* 将V1插入V2的表头 */NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}LGraph BuildGraph()
{LGraph Graph;Edge E;Vertex V;int Nv, i;scanf("%d", &Nv); /* 读入顶点个数 */Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ scanf("%d", &(Graph->Ne)); /* 读入边数 */if ( Graph->Ne != 0 ) { /* 如果有边 */ E = (Edge)malloc( sizeof(struct ENode) ); /* 建立边结点 */ /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */for (i=0; i<Graph->Ne; i++) {scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); /* 注意:如果权重不是整型,Weight的读入格式要改 */InsertEdge( Graph, E );}} /* 如果顶点有数据的话,读入数据 */for (V=0; V<Graph->Nv; V++) scanf(" %c", &(Graph->G[V].Data));return Graph;
}
图的建立-邻接表表示(C语言)相关推荐
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 无向有权图的建立(邻接链表法) 广度优先搜索 深度优先搜素
/**图的邻接表存储方式*/#include<iostream> #include<cstdio> #include<string.h> #include<s ...
- 图2——利用邻接表创建有向图
图2--利用邻接表创建有向图 图 假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表. 主要考查对邻接表的理解.图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是 ...
- c语言边序列构造邻接表,结构C语言版期末考试考试(有答案).doc
人生难得几回搏,此时不搏更待何时? "数据结构"期末考试试题 一.单选题(每小题2分 共12分) 1.在一个单链表HL中 若要向表头插入一个由指针p指向的结点 则执行( ) A. ...
- 数据结构【图】—023邻接表深度和广度遍历
1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...
- java怎么建立邻接表,java实现邻接表
图的邻接表表示和实现 7.3 图的遍历 8.3.4 构造链地址法的散列表 8.4.1 二叉排序树 10.2 实现迭代器 Vertex AdjListGraph AbstractGraph Hash.. ...
- 图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)
#include<iostream> #include<string> #include<list> #include<queue> #include& ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 邻接表-数据结构(C语言)
邻接表 邻接表的构造与邻接矩阵完全不同,同学们应该发现了,邻接表的的结构更像是由几个链表构成的. 在构造邻接表时,我们的确会借助链表的结构.对图中每个顶点的信息,我们都会分别使用一个链表来进行存储.因 ...
最新文章
- 任务队列,消息队列和rpc的区别是什么?
- python前端HTML和CSS进阶
- distinct aggregation
- PAT甲级1137 Final Grading:[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数
- python缩进的用途和使用方法_如何用Python减少循环层次和缩进的技巧
- intellij idea 2018 license 可用无废话
- rto净化效率计算公式_你了解废气处理设备RTO蓄热式热氧化炉的工作原理么?
- 服务器虚拟化网口,服务器安装虚拟网口
- oracle9i 全库备份,Windows下Oracle9i数据库文件如何自动备份?
- 资料员考试题库计算机,资料员考试试题库及答案(5套).docx
- 红旗linux mysql_请问红旗Linux下,安装Mysql时,应该下载mysql 的哪一种rpm包?谢谢
- 房屋建筑结构安全自动在线监测系统解决方案
- 软件图标显示不正常的问题
- matlab安时积分法计算soc,一种带加权的安时积分的SOC估算方法与流程
- 服务器开机日志文件,大芒果启动WOW服务器 提示日志文件找不到怎么办
- 网络流量监控(局域网)
- 智能网联公交的三大发展趋势
- python找出连续的最长的字母串
- 如何使服务器信号加强,增强路由器信号的操作方法
- 成为大数据工程师需要具备什么能力?发展前景好么
热门文章
- linux脚本打印循环次数,shell脚本编程基础(3)——循环用法
- Android之在在EditText的xml里面配置了相关属性依然没有显示光标问题
- Android之稍微靠谱点的透明Activity(不获取触摸事件)
- Windows之Wireshake之抓HTTP请求包(过滤目的IP)
- Nginx指南和配置详解
- 惊了!日本街头出现透明公厕,竟有人排队抢着上!
- 用一个小球揭开地球的面纱,探索地球运转的秘密!
- Lanchester战争模型:用可分离变量的微分方程占卜战事
- 烧录imx6需要的linux空间,IMX6Q学习笔记——开发板的Linux系统更新和烧录
- linux 创建ll,两台linux建立GRE隧道