代码如下:

/* 图的邻接表表示法 */#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语言)相关推荐

  1. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  2. 无向有权图的建立(邻接链表法) 广度优先搜索 深度优先搜素

    /**图的邻接表存储方式*/#include<iostream> #include<cstdio> #include<string.h> #include<s ...

  3. 图2——利用邻接表创建有向图

    图2--利用邻接表创建有向图 图 假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表. 主要考查对邻接表的理解.图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是 ...

  4. c语言边序列构造邻接表,结构C语言版期末考试考试(有答案).doc

    人生难得几回搏,此时不搏更待何时? "数据结构"期末考试试题 一.单选题(每小题2分 共12分) 1.在一个单链表HL中 若要向表头插入一个由指针p指向的结点 则执行( ) A. ...

  5. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  6. java怎么建立邻接表,java实现邻接表

    图的邻接表表示和实现 7.3 图的遍历 8.3.4 构造链地址法的散列表 8.4.1 二叉排序树 10.2 实现迭代器 Vertex AdjListGraph AbstractGraph Hash.. ...

  7. 图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)

    #include<iostream> #include<string> #include<list> #include<queue> #include& ...

  8. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  9. 邻接表-数据结构(C语言)

    邻接表 邻接表的构造与邻接矩阵完全不同,同学们应该发现了,邻接表的的结构更像是由几个链表构成的. 在构造邻接表时,我们的确会借助链表的结构.对图中每个顶点的信息,我们都会分别使用一个链表来进行存储.因 ...

最新文章

  1. 任务队列,消息队列和rpc的区别是什么?
  2. python前端HTML和CSS进阶
  3. distinct aggregation
  4. PAT甲级1137 Final Grading:[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数
  5. python缩进的用途和使用方法_如何用Python减少循环层次和缩进的技巧
  6. intellij idea 2018 license 可用无废话
  7. rto净化效率计算公式_你了解废气处理设备RTO蓄热式热氧化炉的工作原理么?
  8. 服务器虚拟化网口,服务器安装虚拟网口
  9. oracle9i 全库备份,Windows下Oracle9i数据库文件如何自动备份?
  10. 资料员考试题库计算机,资料员考试试题库及答案(5套).docx
  11. 红旗linux mysql_请问红旗Linux下,安装Mysql时,应该下载mysql 的哪一种rpm包?谢谢
  12. 房屋建筑结构安全自动在线监测系统解决方案
  13. 软件图标显示不正常的问题
  14. matlab安时积分法计算soc,一种带加权的安时积分的SOC估算方法与流程
  15. 服务器开机日志文件,大芒果启动WOW服务器 提示日志文件找不到怎么办
  16. 网络流量监控(局域网)
  17. 智能网联公交的三大发展趋势
  18. python找出连续的最长的字母串
  19. 如何使服务器信号加强,增强路由器信号的操作方法
  20. 成为大数据工程师需要具备什么能力?发展前景好么

热门文章

  1. linux脚本打印循环次数,shell脚本编程基础(3)——循环用法
  2. Android之在在EditText的xml里面配置了相关属性依然没有显示光标问题
  3. Android之稍微靠谱点的透明Activity(不获取触摸事件)
  4. Windows之Wireshake之抓HTTP请求包(过滤目的IP)
  5. Nginx指南和配置详解
  6. 惊了!日本街头出现透明公厕,竟有人排队抢着上!
  7. 用一个小球揭开地球的面纱,探索地球运转的秘密!
  8. Lanchester战争模型:用可分离变量的微分方程占卜战事
  9. 烧录imx6需要的linux空间,IMX6Q学习笔记——开发板的Linux系统更新和烧录
  10. linux 创建ll,两台linux建立GRE隧道