图的邻接表表示法:

邻接表(Adjacency List) 是图的 一 种链式存储结构。在邻接表中,对图中每个顶点V建立一个单链表,把与 V相邻接的顶点放在这个链表中。邻接表中每个单链表的第一个结点存放有关顶点的信息, 把这 一 结点看成链表的表头, 其余结点存放有关边的信息, 这样邻接表便由两部分组成:表头结点表和边表。

(1) 表头结点表:由所有表头结点以顺序结构的形式存储, 以便可以随机访问任 一 顶点的边链表。表头结点包括数据域 (data) 和链域 (firstarc) 两部分。其中, 数据域用于存储顶点 V 的名称或其他有关信息;链域用千指向链表中第 一 个结点(即与顶点 V邻接的第 一 个邻接点)。

(2)边表:由表示图中顶点间关系的 2n个边链表组成。边链表中边结点包括邻接点域

(adjvex) 、数据域 (info) 和链域 (nextarc) 三部分。其中, 邻接点域指示与顶点 V邻接的点在图中的位置;数据域存储和边相关的信息, 如权值等;链域指示与顶点v邻接的下 一 条边的结点。

data firstarc

表头节点

adjvex info nextarc

边结点

【算法步骤】

1.输入总顶点数和总边数。

2.依次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL。

3.创建邻接表。依次输入每条边依附的两个顶点, 确定这两个顶点的序号i和j之后, 将此边结点分别插入 Vi 和vj 对应的两个边链表的头部。

//邻接矩阵法构造无向图
void CreateUGD(ALGraph &G){printf("请输入图的总顶点数:");cin>>G.vexnum;printf("请输入图的总边数:");cin>>G.arcnum;//输入各点,构造表头结点表for(int i=0;i<G.vexnum;i++){printf("请输入第%d个顶点信息:",(i+1));cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;} //输入各边,构造邻接表 for(int k=0;k<G.arcnum;k++){printf("输入第%d条边的信息:\n", (k+1));printf("输入边依附的第一个顶点:");VerTexType v1;cin>>v1;printf("输入边依附的第二个顶点:");VerTexType v2;cin>>v2;//确定v1,v2在图G中的位置,即在G.vertices中的序号int i= LocateVex(G, v1);int j= LocateVex(G, v2);struct ArcNode *p1, *p2;p1=new ArcNode; //生成一个新的边结点 p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;p2=new ArcNode; //生成另一个对称边结点p2 p2->adjvex=i;p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;}
} 

完整的实现代码如下:

#include<stdio.h>
#include<stack>
#include <iostream>
#define MAXSIZE 100
#define MaxInt 32767 //表示最大值,即正无穷大
#define MVNum 100 //定义最大顶点数
using namespace std;typedef char VerTexType; //假设顶点数据类型为字符型
typedef int ArcType; //假设边的权值为整型
//定义边结点
typedef struct ArcNode{int adjvex;//该边所指向的顶点的位置struct ArcNode *nextarc; //下一条边的指针
}ArcNode;
//定义顶点结点信息
typedef struct VNode{VerTexType data;ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];
//定义邻接表的结构
typedef struct {AdjList vertices;int vexnum, arcnum; //当前图的点数和边数
}ALGraph; //确定顶点vex在G.vertices中的序号
int LocateVex(ALGraph &G, VerTexType vex){for(int i=0;i<G.vexnum;i++){if(G.vertices[i].data==vex){return i;}}
} //邻接矩阵法构造无向图
void CreateUGD(ALGraph &G){printf("请输入图的总顶点数:");cin>>G.vexnum;printf("请输入图的总边数:");cin>>G.arcnum;//输入各点,构造表头结点表for(int i=0;i<G.vexnum;i++){printf("请输入第%d个顶点信息:",(i+1));cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;} //输入各边,构造邻接表 for(int k=0;k<G.arcnum;k++){printf("输入第%d条边的信息:\n", (k+1));printf("输入边依附的第一个顶点:");VerTexType v1;cin>>v1;printf("输入边依附的第二个顶点:");VerTexType v2;cin>>v2;//确定v1,v2在图G中的位置,即在G.vertices中的序号int i= LocateVex(G, v1);int j= LocateVex(G, v2);struct ArcNode *p1, *p2;p1=new ArcNode; //生成一个新的边结点 p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;p2=new ArcNode; //生成另一个对称边结点p2 p2->adjvex=i;p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;}
} //遍历图的邻接表
void PrintfG(ALGraph &G){printf("遍历图的邻接表:\n");for(int i=0;i<G.vexnum;i++){printf("顶点%c ", G.vertices[i].data);ArcNode *p;p=G.vertices[i].firstarc;while(p){printf("%d ", p->adjvex);p=p->nextarc;}}
}int main(){ALGraph G;CreateUGD(G);PrintfG(G);
}

邻接表法创建有向图的算法:

//邻接矩阵法构造有向图
void CreateUGD(ALGraph &G){printf("请输入图的总顶点数:");cin>>G.vexnum;printf("请输入图的总边数:");cin>>G.arcnum;//输入各点,构造表头结点表for(int i=0;i<G.vexnum;i++){printf("请输入第%d个顶点信息:",(i+1));cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;} //输入各边,构造邻接表 for(int k=0;k<G.arcnum;k++){printf("输入第%d条边的信息:\n", (k+1));printf("输入边依附的第一个顶点:");VerTexType v1;cin>>v1;printf("输入边依附的第二个顶点:");VerTexType v2;cin>>v2;//确定v1,v2在图G中的位置,即在G.vertices中的序号int i= LocateVex(G, v1);int j= LocateVex(G, v2);struct ArcNode *p1, *p2;p1=new ArcNode; //生成一个新的边结点 p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;//与无向图相反,有向图不需要生成对称边结点//p2=new ArcNode; //生成另一个对称边结点p2 //p2->adjvex=i;//p2->nextarc=G.vertices[j].firstarc;//G.vertices[j].firstarc=p2;}
} 

完整的代码实现如下:

#include<stdio.h>
#include<stack>
#include <iostream>
#define MAXSIZE 100
#define MaxInt 32767 //表示最大值,即正无穷大
#define MVNum 100 //定义最大顶点数
using namespace std;typedef char VerTexType; //假设顶点数据类型为字符型
typedef int ArcType; //假设边的权值为整型
//定义边结点
typedef struct ArcNode{int adjvex;//该边所指向的顶点的位置struct ArcNode *nextarc; //下一条边的指针
}ArcNode;
//定义顶点结点信息
typedef struct VNode{VerTexType data;ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];
//定义邻接表的结构
typedef struct {AdjList vertices;int vexnum, arcnum; //当前图的点数和边数
}ALGraph; //确定顶点vex在G.vertices中的序号
int LocateVex(ALGraph &G, VerTexType vex){for(int i=0;i<G.vexnum;i++){if(G.vertices[i].data==vex){return i;}}
} //邻接矩阵法构造有向图
void CreateUGD(ALGraph &G){printf("请输入图的总顶点数:");cin>>G.vexnum;printf("请输入图的总边数:");cin>>G.arcnum;//输入各点,构造表头结点表for(int i=0;i<G.vexnum;i++){printf("请输入第%d个顶点信息:",(i+1));cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;} //输入各边,构造邻接表 for(int k=0;k<G.arcnum;k++){printf("输入第%d条边的信息:\n", (k+1));printf("输入边依附的第一个顶点:");VerTexType v1;cin>>v1;printf("输入边依附的第二个顶点:");VerTexType v2;cin>>v2;//确定v1,v2在图G中的位置,即在G.vertices中的序号int i= LocateVex(G, v1);int j= LocateVex(G, v2);struct ArcNode *p1, *p2;p1=new ArcNode; //生成一个新的边结点 p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;//p2=new ArcNode; //生成另一个对称边结点p2 //p2->adjvex=i;//p2->nextarc=G.vertices[j].firstarc;//G.vertices[j].firstarc=p2;}
} //遍历图的邻接表
void PrintfG(ALGraph &G){printf("遍历图的邻接表:\n");for(int i=0;i<G.vexnum;i++){printf("顶点%c ", G.vertices[i].data);ArcNode *p;p=G.vertices[i].firstarc;while(p){printf("%d ", p->adjvex);p=p->nextarc;}}
}int main(){ALGraph G;CreateUGD(G);PrintfG(G);
}

使用邻接表创建无向图和有向图相关推荐

  1. 6-6 采用邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 函数接口定义: void CreateUDG(ALGraph &G); 其中 G 是采用邻接表表示的无向图. 裁判测试程序样例: #includ ...

  2. 数据结构与算法A实验六图论---7-11 邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...

  3. 利用邻接表创建无向图

    #include<iostream> using namespace std; #define MVNum 100 #define OK 1 typedef char VerTexType ...

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

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

  5. 邻接表-建立无向图、无向网、有向图、有向网

    #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 #define OK  1 #define ERR ...

  6. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  7. C++实现邻接表存储的图及bfs遍历

    #include <iostream> #include <queue> using namespace std; typedef char VerTexType; #defi ...

  8. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  9. 图——邻接表法创建无向图算法。走起。。。。

    一.算法步骤: 1.先输入无向图的的总顶点数和边数. 2.输入每个顶点的信息,并把所有顶点结点中的firstarc置为NULL. 3.输入与每条边相关联的两个顶点. 4.找到两个顶点的位置即在顶点结点 ...

最新文章

  1. intellij idea cpu占用率太大太满 运行速度太慢解决方案
  2. 创建 OVS 外部网络 ext_net - 每天5分钟玩转 OpenStack(144)
  3. 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...
  4. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  5. POJ 1191 棋盘分割【区间类DP】
  6. 尼康1c全站仪语言设置,尼康NIVO.1C全站仪
  7. 基于steam的游戏销量预测 — PART 3 — 基于BP神经网络的机器学习与预测
  8. 模仿excel复合饼图 (饼-柱)
  9. 别让蛋壳跑了、打工人的「爷青回」和今天团购了吗?|极客一周
  10. java、Dom4j、循环迭代递归解析XML,不论是否是叶子节点、有复合结构
  11. ArcGIS读取天地图2.0
  12. 数据库之Mac下Mysql命令全集
  13. 信息论与编码_信息与编码系列(五)不可靠信道——决策法则、Hamming距离与信息论基本定理...
  14. 建模工具:octave
  15. 根据 Excel 中的数据批量修改文件的扩展名
  16. 58同城mysql实践
  17. 永无乡 HYSBZ - 2733
  18. 广东省汕头市谷歌卫星地图下载
  19. linux杀死线程函数,Linux线程-pthread_kill
  20. C++课程设计 房产中介管理系统(代码全)

热门文章

  1. 死亡之雨新的僵尸病毒中文破解版 v1.0绿色免安装版
  2. 图像文本检测的标注工具_如何检测图像中的文本
  3. [程序员福利] 获取Lynda视频课程免费账户
  4. pete shinners_Hanselminutes播客226-使用Pete Brown构建自己的Ultimate Developer PC 2.0
  5. 2022.01.26翻译Watermelon
  6. 【NOIP2014提高组】飞扬的小鸟
  7. 激人奋进的七个经典故事
  8. php 字符串截取去掉最后一个字符,php去掉字符串的最后一个字符附substr()的用法...
  9. 南澳州政府拒绝更换DOS病历软件:称为患者安全着想
  10. Promise--promise 的状态改变 promise 的基本流程