当前位置: 首页 > news >正文

《数据结构(C语言版)第二版》第六章-图(6.4 图的存储结构——6.4.1 邻接矩阵)

无向图UDG、有向图DG:
最大顶点个数为MVNum(100),顶点数据类型为VerTexType(char);边的权值的极大值∞为Maxint(32767),边的权值类型为ArcType(int)
//邻接矩阵存储表示,结构
{一维数组顶点表vexs ,内存大小为最大顶点个数MVNum;二维数组邻接矩阵arcs,阶数为最大顶点个数MVNum,不存在的边权值为0(初始化值),存在的边权值全部为1;顶点个数为vexnum;边数为arcnum;
}AMGraph
无向网UDN、有向网DN:
最大顶点个数为MVNum(100),顶点数据类型为VerTexType(char);边的权值的极大值∞为Maxint(32767),边的权值类型为ArcType(int)
//邻接矩阵存储表示,结构
{一维数组顶点表vexs,内存大小为最大顶点个数MVNum;二维数组邻接矩阵arcs,阶数为最大顶点个数MVNum,不存在的边权值为∞(初始化值),存在的边权值为Wi;顶点个数为vexnum;边数为arcnum;
}AMGraph

采用邻接矩阵表示法创建无向网

//算法6.1 采用邻接矩阵表示法创建无向网#include <stdio.h>
#include <stdlib.h>#define MaxInt 32767
#define MVNum 100typedef char VerTexType;
typedef int ArcType;typedef struct
{VerTexType vexs[MVNum];ArcType arcs[MVNum][MVNum];int vexnum;int arcnum;
}AMGraph;void CreateUDN(AMGraph& G);
int LocateVex(AMGraph& G, VerTexType v);
void printfAMGraph(AMGraph& G);int main()
{AMGraph G = {  {'\0'}, {0}, 0, 0};CreateUDN(G);printfAMGraph(G);return 0;
}void CreateUDN(AMGraph& G) 
{int i = 0;int j = 0;int k = 0;VerTexType v1 = '\0';VerTexType v2 = '\0';ArcType w = 0;printf("请输入无向网的总顶点数:");scanf_s(" %d", &G.vexnum);printf("请输入无向网的总边数:");scanf_s(" %d", &G.arcnum);for (i = 0; i < G.vexnum; ++i){printf("请输入第%d个顶点储存的元素:", i + 1);scanf_s(" %c", &G.vexs[i],sizeof(VerTexType));}//初始化邻接矩阵,将边的权值均置为极大值MaxIntfor (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){G.arcs[i][j] = MaxInt;}}//构造邻接矩阵for (k = 0; k < G.arcnum; ++k){printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车) : ", k+1);scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType)); //scanf_s函数中在读取的内容前面,不能有除空格之外的其它内容printf("请输入第%d条边的权值 : ", k + 1);scanf_s(" %d", &w, sizeof(ArcType));i = LocateVex(G, v1);j = LocateVex(G, v2);G.arcs[i][j] = w;G.arcs[j][i] = G.arcs[i][j];}
}//在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
int LocateVex(AMGraph &G,VerTexType v)
{int i = 0;for (i = 0; i < G.vexnum && (G.vexs[i] != v); ++i){;}return i;
}//打印邻接矩阵表示法中的顶点表vexs和邻接矩阵arcs
void printfAMGraph(AMGraph& G)
{int i = 0;int j = 0;printf("各顶点为:");for (i = 0; i < G.vexnum; i++){printf("%c ", G.vexs[i]);}printf("\n邻接矩阵为:\n");for (i = 0; i < G.vexnum; i++){for (j = 0; j < G.vexnum; j++){if (G.arcs[i][j] == 32767){printf("%d  ", G.arcs[i][j]);}else{printf("%d      ", G.arcs[i][j]);}}printf("\n");}
}

在这里插入图片描述

在这里插入图片描述

采用邻接矩阵表示法创建无向图

//采用邻接矩阵表示法创建无向图void CreateUDG(AMGraph& G) 
{int i = 0;int j = 0;int k = 0;VerTexType v1 = '\0';VerTexType v2 = '\0';ArcType w = 0;printf("请输入无向图的总顶点数:");scanf_s(" %d", &G.vexnum);printf("请输入无向图的总边数:");scanf_s(" %d", &G.arcnum);for (i = 0; i < G.vexnum; ++i){printf("请输入第%d个顶点储存的元素:", i + 1);scanf_s(" %c", &G.vexs[i],sizeof(VerTexType));}//初始化邻接矩阵,将边的权值均置为0for (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){G.arcs[i][j] = 0;}}//构造邻接矩阵for (k = 0; k < G.arcnum; ++k){printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车) : ", k+1);scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));i = LocateVex(G, v1);j = LocateVex(G, v2);G.arcs[i][j] = 1;  //存在的边权值均为1G.arcs[j][i] = G.arcs[i][j];}
}

在这里插入图片描述
在这里插入图片描述

一个图的邻接矩阵表示是唯一的,但其邻接表表示不唯一。

不改变图中每个顶点的命名方式,也不改变图的边(每条边的起终点),仅改变边的输入次序时,图的邻接矩阵不会发生变化。
因为图中的顶点没变,边也没变,构造邻接矩阵时,最终输入的边及其起点、终点都不会发生变化。即寻找并给邻接矩阵元素A[i][j]赋值时,行列下标及A[i][j]都不会发生变化,因此图的邻接矩阵也不会发生变化。
边输入次序的改变仅会引起构造邻接矩阵时,矩阵中元素的产生次序。

在这里插入图片描述

采用邻接矩阵表示法创建有向网

//采用邻接矩阵表示法创建有向网
void CreateDN(AMGraph& G) 
{int i = 0;int j = 0;int k = 0;VerTexType v1 = '\0';VerTexType v2 = '\0';ArcType w = 0;printf("请输入有向网的总顶点数:");scanf_s(" %d", &G.vexnum);printf("请输入有向网的总边数:");scanf_s(" %d", &G.arcnum);for (i = 0; i < G.vexnum; ++i){printf("请输入第%d个顶点储存的元素:", i + 1);scanf_s(" %c", &G.vexs[i],sizeof(VerTexType));}//初始化邻接矩阵,将边的权值均置为极大值MaxIntfor (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){G.arcs[i][j] = MaxInt;}}//构造邻接矩阵for (k = 0; k < G.arcnum; ++k){printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车) : ", k+1);scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));printf("请输入第%d条边的权值 : ", k + 1);scanf_s(" %d", &w, sizeof(ArcType));i = LocateVex(G, v1);j = LocateVex(G, v2);G.arcs[i][j] = w;}
}

在这里插入图片描述
在这里插入图片描述

采用邻接矩阵表示法创建有向图

//采用邻接矩阵表示法创建有向图void CreateDG(AMGraph& G) 
{int i = 0;int j = 0;int k = 0;VerTexType v1 = '\0';VerTexType v2 = '\0';ArcType w = 0;printf("请输入有向图的总顶点数:");scanf_s(" %d", &G.vexnum);printf("请输入有向图的总边数:");scanf_s(" %d", &G.arcnum);for (i = 0; i < G.vexnum; ++i){printf("请输入第%d个顶点储存的元素:", i + 1);scanf_s(" %c", &G.vexs[i],sizeof(VerTexType));}//初始化邻接矩阵,将边的权值均置为0for (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){G.arcs[i][j] = 0;}}//构造邻接矩阵for (k = 0; k < G.arcnum; ++k){printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车) : ", k+1);scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));i = LocateVex(G, v1);j = LocateVex(G, v2);G.arcs[i][j] = 1;}
}

在这里插入图片描述

在这里插入图片描述

相关文章:

  • Java基础之字面值常量
  • html+css+js网页设计 大一电商6个页面 带js 有轮播图,增删改查等功能
  • 【Qt】QWidget的windowTitle属性
  • Linux信号控制进程种类、内存查看和NICE优先级
  • 在CentOS 7 上安装和配置 uwsgi 详细教程
  • Secure Coding in C and C ++ (三)关于语法与指针的感悟
  • gitlab实现CI/CD自动化部署
  • Kafka 的 ISR 机制
  • 并查集..
  • 智启万象|挖掘广告变现潜力,保障支付安全便捷
  • 集成高精度16bit模数转换ADC电路的两通道测量高精度电容调理芯片 - MDC02
  • C盘磁盘空间不足:VirtualBox的锅
  • 代码随想录 day 39 动态规划 打家劫舍
  • Adobe PhotoShop - 制图操作
  • 【计算机网络——分组延时,丢失,吞吐量】
  • php的引用
  • 【笔记】你不知道的JS读书笔记——Promise
  • Consul Config 使用Git做版本控制的实现
  • ES10 特性的完整指南
  • ES6之路之模块详解
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java教程_软件开发基础
  • Java精华积累:初学者都应该搞懂的问题
  • PermissionScope Swift4 兼容问题
  • QQ浏览器x5内核的兼容性问题
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 类orAPI - 收藏集 - 掘金
  • 数据科学 第 3 章 11 字符串处理
  • 我有几个粽子,和一个故事
  • ​2021半年盘点,不想你错过的重磅新书
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (12)Linux 常见的三种进程状态
  • (35)远程识别(又称无人机识别)(二)
  • (7)摄像机和云台
  • (day6) 319. 灯泡开关
  • (LeetCode 49)Anagrams
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)学习JVM —— 垃圾回收机制
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (分布式缓存)Redis分片集群
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (一)Dubbo快速入门、介绍、使用
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *2 echo、printf、mkdir命令的应用
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件_Git:.gitignore
  • .htaccess配置重写url引擎
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 连接达梦数据库开发环境部署