首页 > 其他分享 >图的创建——C语言描述

图的创建——C语言描述

时间:2023-05-21 21:44:38浏览次数:37  
标签:Eadge int 创建 ++ C语言 MGraph Vector VectorNum 描述

图的创建——C语言描述

目录

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();
	BuildMGraph(&MGraph01, Vector01, Eadge01, VectorNum01, EadgeNum01);
	PrintMGraph(&MGraph01);
	TestMGraph(&CmpGraph01, &MGraph01);

	/*Test01*/
	printf("\n-------Test 01----------\n");


	/*Test Result*/
	printf("\n-------Test result----------\n");
	TestResult();
}

(3)打印结果

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 01----------

-------Test result----------

Print test result;

TestNum = 1, PassNum = 1, FaildNum = 0

标签:Eadge,int,创建,++,C语言,MGraph,Vector,VectorNum,描述
From: https://www.cnblogs.com/meditatorss/p/17419237.html

相关文章

  • 复习C语言小问题
    1:强制类型转换的问题2:空间配置器的原理以及作用。3:复习C语言是支持隐式类型的转换的,但是这个转换的过程比较的“简陋”只用一个赋值运算符就完事了,但是有些类型转换是比较危险的,比如静态变量强制转换位非静态变量,因为静态变量存在寄存器中,编译器取的时候是寄存器中取得,如果用指......
  • C语言编程—存储知识
    存储类定义C程序中变量/函数的的存储位置、生命周期和作用域。这些说明符放置在它们所修饰的类型之前。下面列出C程序中可用的存储类:autoregisterstaticexternauto存储类auto存储类是所有局部变量默认的存储类。定义在函数中的变量默认为auto存储类,这意味着它们在函数开始......
  • Linux 文件描述符
    最近在复习tcp/ip知识,其中有关的一个问题"一台服务器做多支持多少个TCP链接"和Linux下的文件描述符有关,学习一下。Linux中,一切设备都是文件,对文件的操作都是通过文件描述符来进行的。文件描述符的定义:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一......
  • C语言--位运算
    位运算符只能用于整数类型左移和右移运算符的右操作数范围必须为【0,31】位运算没有短路原则(!取反),所有操作数均会求值位运算的效率高于四则运算和逻辑运算运算优先级:四则运算》位运算》逻辑运算......
  • C语言--单引号和双引号
    单引号用来表示字符字面量,被编译为对应的ASCII码,括起来的当个字符代表整数双引号用来表示字符串字面量,被编译为对应的内存地址,括起来的字符串代表字符指针'a'表示字符字面量--1个字节"a"表示字符串字面量--2个字节 内存的低地址空间不能在程序中随意访问......
  • C语言--接续符
    编译器会将反斜杠剔除,跟在反斜杠后面字符自动接续到前一行在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格接续符适合在定义宏代码块时使用\n回车换行\t横向跳到下一制表位置\v竖向跳格\b退格\r回车\f走纸换页\\反斜杠符“\”......
  • 简单封装JWTUtils实现对token的创建和过期时间检查
    想要使用jwt需要先导入依赖<!--https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></depend......
  • c语言
    C语言是一种高级程序设计语言,由贝尔实验室的DennisRitchie在20世纪70年代初开发而成。它是一种通用性强、效率高、功能丰富的编程语言,被广泛应用于计算机科学和软件工程领域。C语言的特点之一是它具有较高的可移植性。这意味着开发人员可以在不同的操作系统和硬件平台上编写相同的......
  • ASP.NET Core之由配置系统与创建app所想到的
    先看文件配置的代码:ConfigurationBuilderconfigBuilder=newConfigurationBuiler();//典型的创建者模式configBuilder.AddJsonFile("config.json",option:false,reloadChange:false);//添加json配置文件,属于是创建者模式环节中的“配置创建者条件”的环节IconfigurationRootc......
  • 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(1)
    忙活了那么久,终于进入正题,ExtJSMVC开发。开始前,先说说4.1.1的一点点变化。在4.1的时候,要先创建一个扩展于Ext.app.Application的类,然后用create创建它的实例来开始应用程序的。而在4.1.1,则可直接调用application方法开始执行应用程序,简化了。调用application方法,其参数是一个配置......