图的创建——C语言描述

news/2024/10/18 5:51:39/

图的创建——C语言描述

文章目录

  • 图的创建——C语言描述
  • 0 测试用例框架
  • 1 定义
  • 2 邻接矩阵法
    • 2.1 数据结构
  • 2.2 构建图代码
    • (2)测试用例
    • (3)**打印结果**

0 测试用例框架

https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127137119%22%2C%22source%22%3A%22m0_59469991%22%7D

1 定义

​ 图是由顶点的有穷非空集合和顶点之间边的集合组成的,表示为G(V, E).先把key值存到表里面去,存的过程哈希表Hashkey与表里面的值(Key)一一对应,存表冲突时使用开放地址法解决。时间复杂度为O(1),空间复杂度为O(n).

2 邻接矩阵法

​ 用一维数组表示图的顶点,用二维数组表示边的关系

2.1 数据结构

#define MAX_VEXS_SIZE    (100)
#define MAX_VALUE        (65535)
#pragma pack(1)
typedef struct _M_GRAPH {int VectorNum;int EadgeNum;int Vector[MAX_VEXS_SIZE];int Eadge[MAX_VEXS_SIZE][MAX_VEXS_SIZE];
}M_GRAPH;
#pragma pack()

2.2 构建图代码

void PrintMGraph(M_GRAPH *MGraph) {int i, j;printf("MGraph->VectorNum = %d\n", MGraph->VectorNum);printf("MGraph->EadgeNum = %d\n", MGraph->EadgeNum);for (i = 0; i < MGraph->VectorNum; i++) {printf("MGraph->Vector[%d] = %d\n", i, MGraph->Vector[i]);}for (i = 0; i < MGraph->VectorNum; i++) {for (j = 0; j < MGraph->VectorNum; j++) {printf("MGraph->Vector[%d][%d] = %d, ", i, j, MGraph->Eadge[i][j]);}printf("\n");}
}/*BuildMGraph*/
void BuildMGraph(M_GRAPH *MGraph, int *Vector, int (*Eadge)[4], int VectorNum, int EadgeNum) {int i = 0, j = 0;if ((MGraph == NULL) || (Vector == NULL) || (Eadge == NULL)) {return;}MGraph->VectorNum = VectorNum;MGraph->EadgeNum = EadgeNum;for (i = 0; i < VectorNum; i++) {MGraph->Vector[i] = Vector[i];}for (i = 0; i < VectorNum; i++ ) {for (j = 0; j < VectorNum; j++) {printf("Eadge[%d][%d] = %d\n", i, j, Eadge[i][j]);MGraph->Eadge[i][j] = Eadge[i][j];}}
}

(2)测试用例

void TestMGraph(M_GRAPH *MGraph01, M_GRAPH *MGraph02) {int i, j;TestNum++;if ((MGraph01->VectorNum != MGraph02->VectorNum) || (MGraph01->EadgeNum != MGraph02->EadgeNum)) {FaildNum++;return;}for (i = 0; i < MGraph01->VectorNum; i++) {if (MGraph01->Vector[i] != MGraph02->Vector[i]) {FaildNum++;return;}}for (i = 0; i < MGraph01->VectorNum; i++) {for (j = 0; j < MGraph01->VectorNum; j++) {if (MGraph01->Eadge[i][j] != MGraph02->Eadge[i][j]) {FaildNum++;return;}}}PassNum++;
}void TestBuildMGraph(void) {/*Test01*/M_GRAPH  MGraph01;int Vector01[]   = {0, 1, 2, 3};int Eadge01[][4] = { {0, 1, 1, 1},{1, 0, 1, 0},{1, 1, 0, 1},{1, 0, 1, 0} };int VectorNum01  = 4;int EadgeNum01   = 5;M_GRAPH CmpGraph01 = { 4, 5, {0, 1, 2, 3}, { {0, 1, 1, 1},{1, 0, 1, 0},{1, 1, 0, 1},{1, 0, 1, 0} }};printf("-------Test start----------\n");InitNum();/*Test01*/printf("\n-------Test 01----------\n");BuildMGraph(&MGraph01, Vector01, Eadge01, VectorNum01, EadgeNum01);PrintMGraph(&MGraph01);TestMGraph(&CmpGraph01, &MGraph01);/*Test Result*/printf("\n-------Test result----------\n");TestResult();
}

(3)打印结果

-------Test start----------

-------Test 01----------
Eadge[0][0] = 0
Eadge[0][1] = 1
Eadge[0][2] = 1
Eadge[0][3] = 1
Eadge[1][0] = 1
Eadge[1][1] = 0
Eadge[1][2] = 1
Eadge[1][3] = 0
Eadge[2][0] = 1
Eadge[2][1] = 1
Eadge[2][2] = 0
Eadge[2][3] = 1
Eadge[3][0] = 1
Eadge[3][1] = 0
Eadge[3][2] = 1
Eadge[3][3] = 0
MGraph->VectorNum = 4
MGraph->EadgeNum = 5
MGraph->Vector[0] = 0
MGraph->Vector[1] = 1
MGraph->Vector[2] = 2
MGraph->Vector[3] = 3
MGraph->Vector[0][0] = 0, MGraph->Vector[0][1] = 1, MGraph->Vector[0][2] = 1, MGraph->Vector[0][3] = 1,
MGraph->Vector[1][0] = 1, MGraph->Vector[1][1] = 0, MGraph->Vector[1][2] = 1, MGraph->Vector[1][3] = 0,
MGraph->Vector[2][0] = 1, MGraph->Vector[2][1] = 1, MGraph->Vector[2][2] = 0, MGraph->Vector[2][3] = 1,
MGraph->Vector[3][0] = 1, MGraph->Vector[3][1] = 0, MGraph->Vector[3][2] = 1, MGraph->Vector[3][3] = 0,

-------Test result----------
Print test result;
TestNum = 1, PassNum = 1, FaildNum = 0


http://www.ppmy.cn/news/80307.html

相关文章

关于HTTP请求GET和POST的区别

关于HTTP请求GET和POST的区别 1.GET提交&#xff0c;请求的数据会附在URL之后&#xff08;就是把数据放置在HTTP协议头&#xff1c;request-line&#xff1e;中&#xff09; GET:特定浏览器和服务器对URL长度有限制&#xff0c;例如IE对URL长度的限制是2083字节(2K35)。对于…

【Python sqlite3】零基础也能轻松掌握的学习路线与参考资料

Python sqlite3是Python语言自带的轻量级关系数据库管理系统&#xff0c;它可以让我们在不需要额外的安装和配置下&#xff0c;使用SQLite数据库进行操作和管理。SQLite是一个功能强大的嵌入式数据库&#xff0c;它非常适合在轻量级应用程序中使用&#xff0c;如桌面应用程序、…

数据结构—排序算法交换排序(冒泡快排)

目录 1.交换排序—冒泡排序 1.1冒泡排序基本思想 1.2冒泡排序的实现 2.交换排序—快速排序 1.1快速排序基本思想 1.2基准值划分—分析 1. hoare版&#xff1a; 2. 挖坑法&#xff1a; 3. 前后指针版本 1.3 hoare快排的具体实现 1.4 挖坑法快排的具体实现 1.5 前后指…

网安面试题大全(附答案)

本文面试题汇总&#xff1a; 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么&#xff1f;rip的工作原理 什么是RARP&#xff1f;工作原理 OSPF协议&#xff1f;OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手&#xff1f; tcp为什么要三次握手…

Python数据结构与算法篇(十五)-- 二叉树的遍历:深度优先搜索与广度优先搜索

本篇开始总结二叉树的常用解题技巧&#xff0c;二叉树的顺序遍历和层序遍历刚好对应深度优先搜索和广度优先搜索。 1 顺序遍历 题目列表 144. 前序遍历145. 二叉树的后序遍历 94. 二叉树的中序遍历 144. 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它…

SpringBoot实现限流注解

SpringBoot实现限流注解 在高并发系统中&#xff0c;保护系统的三种方式分别为&#xff1a;缓存&#xff0c;降级和限流。 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待…

基于中文在线文档的Polars工具介绍

Polars学习简介 Polars是一个能够提取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;与加载&#xff08;Load&#xff09;大规模数据集的工具&#xff08;快速多线程、单指令多数据流、延迟/即时执行、查询优化、混合流等&#xff09;。根据官方开发…

网络安全的学习路线是怎么样的?

在众多高大上的学习路线指导中&#xff0c;尝试做一股清流&#xff0c;把要讲清楚的都讲清楚&#xff0c;该学些什么&#xff0c;学到哪个程度进入到下一阶段的学习这些才是最重要的。 在学习之前首先要做好学习的系统规划&#xff1a; 1.目前市场需求主流的岗位里&#xff0…