编译环境:vs2019
图的遍历(深度优先和广度优先)

         邻接矩阵

一:基本概念

  邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G= (V,E)是一个图,其中V= {v1,v2,…,vn} 。G的邻接矩阵是一个具有下列性质的n阶方阵:①对 无向图 而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0, 有向图 则不一定如此。. ②在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。

二:实例展示

无向图:矩阵对称
无向图变有向图:删除第44行代码 G.arcs[j][i] = G.arcs[i][j];
如下:

三:代码及注释

#include <stdio.h>
#define MaxInt 32767
#define MVNum 10
typedef char VerTexType;//顶点类型
typedef int ArcType;//边类型
typedef struct {VerTexType vexs[MVNum];ArcType arcs[MVNum][MVNum];int vexnum, arcnum;
}AMGraph;int LocateVex(AMGraph G, VerTexType u)
{for (int i = 0; i < G.vexnum; ++i)if (u == G.vexs[i])return i;//返回u的位置return -1;
}
void CreateUDN(AMGraph& G) {//采用邻接矩阵表示法,创建无向网Gint i, j, k, w;char v1, v2;printf("请输入顶点个数和边数,并用逗号隔开:");scanf_s("%d,%d", &G.vexnum, &G.arcnum);//输入总顶点数,总边数 getchar();printf("请输入各个顶点:");for (i = 0; i < G.vexnum; ++i) {printf("请输入第%d个顶点:", i + 1);scanf_s("%c", &G.vexs[i], 1);//依次输入顶点的信息 getchar();}for (i = 0; i < G.vexnum; ++i)     //初始化邻接矩阵,边的权值均置为极大值for (j = 0; j < G.vexnum; ++j)G.arcs[i][j] = MaxInt;printf("请输入每条边信息:");for (k = 0; k < G.arcnum; ++k) {   //构造邻接矩阵 printf("请输入第%d条边的信息:", k + 1);scanf_s("%c,%c,%d", &v1, 1, &v2, 1, &w);//输入一条边依附的顶点及权值 getchar();i = LocateVex(G, v1);j = LocateVex(G, v2);          //确定v1和v2在G中的位置G.arcs[i][j] = w;              //边<v1, v2>的权值置为w //无向图互相连通,删除下行代码则为有向图 G.arcs[j][i] = G.arcs[i][j];}
}
int main()
{AMGraph G;CreateUDN(G);puts("邻接矩阵如下:");for (int i = 0; i < G.vexnum; ++i) {for (int j = 0; j < G.vexnum; ++j)printf("%10d", G.arcs[i][j]);printf("\n");}
}

  

         邻接表

一:基本概念

  邻接表是图的一种最主要存储结构,用来描述图上的每一个点。 对图的每个顶点建立一个容器(n个顶点建立n个容器),第i个容器中的结点包含顶点Vi的所有邻接顶点。 实际上我们常用的邻接矩阵就是一种未离散化每个点的边集的邻接表。

二:实例展示

有向图存储:

三:代码及注释:

(包含删除顶点函数)

#include <stdio.h>
#include <stdlib.h>
#define MAXV  10
typedef int vertype;
typedef struct edge {int adjvex;int weight;struct edge* next;
} ELink;
typedef struct ver {vertype vertex;ELink* link;
} VLink;
VLink  G[MAXV];void ADJLIST(VLink G[], int n, int e)//创建邻接矩阵
{int k, vi, vj, weight;ELink* p, * q;//创建n个顶点1~nfor (k = 0; k < n; k++) {G[k].vertex = k + 1;G[k].link = NULL;}for (k = 0; k < e; k++) {printf("请输入第%d条边的信息:", k + 1);//顶点vi指向顶点vj 权值weightscanf_s("%d%d%d", &vi, &vj, &weight);p = (ELink*)malloc(sizeof(ELink));p->adjvex = vj - 1;//vj对应下标adjvexp->weight = weight;p->next = NULL;if (!G[vi - 1].link)G[vi - 1].link = p;else {q = G[vi - 1].link;while (q->next)q = q->next;q->next = p;}}
}void DELVER(VLink G[], int& n, vertype item)//删除图中数据信息为item的那个顶点
{int i, k = -1;ELink* p, * q=NULL, * r;for (i = 0; i < n; i++)  //找到与item相等的定点,返回下标if (G[i].vertex == item) {k = i;break;}//若找到此顶点if (k != -1) {p = G[k].link;for (i = k + 1; i < n; i++)//在顶点数组中删除此顶点,其后顶点前移{G[i - 1].vertex = G[i].vertex - 1;G[i - 1].link = G[i].link;}n--;while (p != NULL)//删除并释放掉第k个链表的所有边结点{r = p;p = p->next;free(r);}for (i = 0; i < n; i++)//将其他顶点和此顶点相关联的边结点删除{p = G[i].link;while (p != NULL) if (p->adjvex == k) {if (G[i].link == p)G[i].link = p->next;else                        q->next = p->next;                   r = p;p = p->next;free(r);}else {if (p->adjvex > k)p->adjvex--;q = p;p = p->next;}                       }}
}void PRINTADJ(VLink G[], int n)
{int i;ELink* p;puts("顶点 下标 权值");for (i = 0; i < n; i++) {printf("%d->", G[i].vertex);p = G[i].link;while (p != NULL) {if (p->next != NULL)printf("%4d %4d->", p->adjvex, p->weight);elseprintf("%4d %4d", p->adjvex, p->weight);p = p->next;}printf("\n");}
}int main()
{int n = 4, e = 6;//四个顶点,六条边ADJLIST(G, n, e);PRINTADJ(G, n);//删除顶点为3的相关信息DELVER(G, n, 2);printf("删除后的邻接矩阵为:\n");PRINTADJ(G, n);
}

图的创建(邻接矩阵和邻接表)相关推荐

  1. 图的存储-邻接矩阵和邻接表之间的相互转化

    邻接矩阵和邻接表之间的相互转化,输出邻接矩阵和邻接表算法实现. 将文件保存为GraphBasicOperation.cpp文件,具体实现如下: #include <stdio.h> #in ...

  2. 图的存储--邻接矩阵和邻接表(链表实现和用vector实现)

    邻接矩阵: #include<iostream> #include<vector> #include<iomanip> #include<string> ...

  3. 图的创建(详解邻接矩阵和邻接表)

    首先,我们来看一下涉及的知识点: 图:图 G=(V,E) 由顶点集 V 和边集 E 组成.每条边对应一个点对 (v,w),其中 v,w 属于 V .如果图中的点对是有序的,那么该图就是有向图,反之为无 ...

  4. 实现图的邻接矩阵和邻接表存储

    /** *    实验题目: *        实现图的邻接矩阵和邻接表存储 *    实验目的: *        领会图的两种主要存储结构和图基本运算算法设计 *    实验内容: *       ...

  5. 图的存储结构(邻接矩阵和邻接表)

    图的存储结构(邻接矩阵和邻接表) 前言: 前面我们学习图的有些定义和术语,对图这个数据结构有了新的见解和认知,让我们理解图结构的知识,今天我们学习图的存储结构,图的存储结构比较多,我们今天主要是学习邻 ...

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

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

  7. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

  8. 图的两种存储形式(邻接矩阵、邻接表)

    图可以使用两种存储结构,分别是邻接矩阵和邻接表. 注意:一个图所对应的邻接矩阵唯一,所对应的邻接表不唯一 一.邻接矩阵 邻接矩阵以矩阵的形式存储图所有顶点间的关系.邻接矩阵具有以下特点: 1.邻接矩阵 ...

  9. 图的表达与遍历--邻接矩阵和邻接表

    今天开始准备学习一个新的数据结构---图,貌似听着挺复杂的,当然实际也不容易啦,所以先从理论上对图有个大概的认识,其实之前咱们学的二叉树就是一种特殊的图,怎么个特殊法呢?因为它没有环,但是图是可以,它 ...

  10. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?

    从今天开始,我们开始介绍图的相关算法 什么是"图" 1.背景 作为图的开始,我们先来看一个经典的问题,它被认为是图论的起源. 这个问题是基于一个现实生活中的事例:河中心有两个小岛. ...

最新文章

  1. option:contains后面加变量_Python基础篇 -2:初识Python中的变量
  2. 机器学习经验总结-神经网络训练失败的一些常见原因
  3. 将windows系统装到USB存储设备
  4. ASP存储过程参数数据类型
  5. java 与 c#的 中 字符串比较“==”与“equals”的差异
  6. mysql 5.5半同步复制_(5.5)mysql高可用系列——MySQL半同步复制(实践)
  7. 崇天老师python123测验6_嵩天老师python123测验1: Python基本语法元素 (第1周)
  8. [js]删除以 [ 开始以 ]结尾且不含:内容
  9. 样条表示---插值和逼近样条
  10. 跨域推荐: 迁移学习和推荐系统的火花碰撞
  11. Jquery多选框互相内容交换
  12. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )...
  13. 使用PrtSc键截屏
  14. Java学习(8) —— 异常处理
  15. 最常用到的35种心理效应集锦
  16. 看完一本青春小说后的感悟。
  17. Python中单引号和双引号括起来的短字符有什么区别
  18. ES6箭头函数以及promise/async/await测试案例
  19. 使用CAGradientLayer绘制渐变色
  20. 你所不知的角落,有人在做没有深度学习的AI

热门文章

  1. 个人项目 实现短信通知功能(java)
  2. aws-vpc-对等连接(不同vpc之间的内网互通)
  3. 程序数据集散地:数据库
  4. Windows 2000系统编程 (1)
  5. 【Home Assistant】获取米家设备 token
  6. Xiaojie雷达之路---TI实战笔记---对AWR1843+DCA1000采集的数据进行解析
  7. 别不信,读书虽然不是唯一的出路,但读书一定是最好的出路
  8. SQL Server数据库报错:无法打开物理文件
  9. (文献随笔)解析未经治疗的人类黑色素瘤脑转移的生态系统 (Cell, 2022年7月7日)
  10. 客观评价 增长趋势比 vite 还猛的 TailwindCSS