07 数据结构之图

news2025/1/15 21:06:04
# Makefile 
CC=gcc
CFLAGS= -g -Wall
SRCS=test.c graph.c link_queue.c
OBJS=$(SRCS:.c=.o)                   #variable replace     
APP=test

all:$(OBJS)                         #指定一个目标, 不然默认目标不会检查依赖文件的时间戳
	$(CC) $(SRCS) -o $(APP)
.PHONY:clean
clean:
	rm ./*.o $(APP)
/* graph .h */
#ifndef _GRAPH_H_
#define _GRAPH_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXN 128

typedef int element_type;
typedef struct {
	element_type vertex[MAXN];
	element_type edge[MAXN][MAXN];
	int reality_num;
}graph_t;

graph_t *graph_create(int n, element_type a[][n]);
int graph_release(graph_t *g);
void vertex_edge_show(graph_t *g);
void DFS(graph_t *g, int v);
void BFS(graph_t *g, int v);

#endif
/* graph .c */
#include "graph.h"
#include "link_queue.h"

/*
*brife: create graph
*/
graph_t *graph_create(int n, element_type a[][n])
{
	if(a == NULL) {
		printf("%s, param is invalid\n", __func__);
		return NULL;
	}

	graph_t *g = (graph_t *)malloc(sizeof(graph_release));
	if(g == NULL) {
		printf("%s, malloc failed\n", __func__);
		return NULL;
	}

	int i, j;
	for(i = 0; i < n; i++) {
		g->vertex[i] = i;					
		for(j = 0; j < n; j++) {
			g->edge[i][j] = a[i][j];
		}
	}

	g->reality_num = n;

	return g;
}

/*
*brife: release graph
*/
int graph_release(graph_t *g)
{
	if(g == NULL) {
		printf("%s, param is invalid\n", __func__);
		return -1;
	}
	
	memset(g, 0, sizeof(graph_t));
	free(g);
	
	return 0;
}

/*
* brife: check vertex and edge
*/
void vertex_edge_show(graph_t *g)
{
	if(g == NULL) {
		printf("%s, param is invalid\n", __func__);
		return;
	}

	int i, j;

	printf("vertex:\n");
	for(i = 0; i < g->reality_num; i++) {
		printf("%d ", g->vertex[i]);
	}
	puts("");

	printf("edge:\n");
	for(i = 0; i < g->reality_num; i++) {
		for(j = 0; j < g->reality_num; j++) {
			printf("%d ", g->edge[i][j]);
		}
		puts("");
	}
	puts("");

	return;
}


/*brife: 深度优先遍历
 *
 * */
void DFS(graph_t *g, int v)
{
	if(g == NULL) {
		printf("%s, param is NULL\n", __func__);
		return ;
	}

	/* 每一次递归使用的就是同一个记录数组 */
	static int visited[MAXN];                /* 数组标记的方法判断某些问题 */
	int i;

	printf("V%d ", v);
	visited[v] = 1;

	for(i = 0; i < g->reality_num; i++) {
		if(g->edge[v][i] == 1 && visited[i] == 0)
			DFS(g, i);
	}

	return ;
}


/*brife: graph breadth foreach
 *
 * */
void BFS(graph_t *g, int v)
{	
	if(g == NULL) {
		printf("%s, param is NULL\n", __func__);
		return ;
	}

	int i, visited[MAXN] = {0};
	
	linkqueue_t *lq;
	if((lq = link_queue_create()) == NULL) {
		printf("%s, link queue create failed\n", __func__);
		return;
	}
	printf("V%d ", v);
	visited[v] = 1;
	
	link_queue_entry(lq, v);

	while(!link_queue_isempty(lq)) {
		v = link_queue_departure(lq);
		for(i = 0; i < g->reality_num; i++) {
			if(g->edge[v][i] == 1 && visited[i] == 0) {
				printf("V%d ", g->vertex[i]);
				visited[i] = 1;
				link_queue_entry(lq, i);
			}
		}
	}

	return;
}
/* test.c */
#include "graph.h"

int main(int argc, const char *argv[])
{
	element_type matrix[4][4] = {
		{0, 1, 1, 0},
		{1, 0, 1, 1},
		{1, 1, 0, 1},
		{0, 1, 1, 0},
	};

	/* matrix address, vertex nums */
	graph_t *g = graph_create(4, matrix);
	if(g == NULL) {
		printf("%s, graph create failed\n", __func__);
		return -1;
	}

	vertex_edge_show(g);

	puts("DFS: ");
	DFS(g, 0);
	puts("");


	puts("BFS: ");
	BFS(g, 0);
	puts("");


	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装Prometheus监控

环境初始化 关闭防火墙 setenforce 0 vim /etc/selinux/config ##################内部代码################### SELINUXdisabled #关闭防火墙 ############################################ 安装docker #卸载yum源之前的docker安装包 sudo yum remove docker docker-clie…

如果你准备进入安全行业,入门应该做的

教育阶段 网络安全是一门高级学科。网络安全人员通常来自三个领域&#xff1a;系统管理、网络、开发。 假设你没有任何这些方面的背景&#xff0c;并且你需要从零开始。如果你在学生阶段的年龄&#xff1f; 这时有三种方法可选&#xff1a;大学、职业学校、资质证书 建议读计…

意大利数据监管机构对Sora展开调查

意大利数据保护监管机构 Garante3月8日宣布&#xff0c;将对 OpenAI 新推出的视频人工智能模型 Sora 展开隐私调查。 监管机构虽然没有对 OpenAI 提出任何具体指控&#xff0c;但表示正在研究 Sora 对意大利&#xff08;包括欧盟&#xff09;个人数据使用可能产生的潜在影响&am…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

unicloud delete 删除

delete 删除 unicloud 删除大概分为两种 一种是 通过指定文档ID删除 语法如下 collection.doc(_id).remove()还有一种是条件查找文档然后直接批量删除 语法如下 collection.where().remove()反正总归是先查找到指定数据,然后使用remove()函数删除 示例如下 collection.doc(…

软件应用实例,宠物医院处方笺模板实例,佳易王兽医电子处方开单管理系统软件操作教程

软件应用实例&#xff0c;宠物医院处方笺模板实例&#xff0c;佳易王兽医电子处方开单管理系统软件操作教程 一、前言 以下软件程序操作教程以佳易王兽医电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、兽医宠物店开电子处…

初识C++类和对象(1)

1.定义类 我们使用class进行表示类&#xff0c;class后面的是类名rect&#xff0c;在类里面我们可以定义成员变量&#xff0c;这个题目我们是要去求长方形的周长和面积&#xff0c;我们定义长方形的长&#xff0c;和长方形的宽度&#xff1b; 我们定义了2个函数计算长方形的周…

电视盒子什么品牌好?测评工作室揭晓电视盒子品牌排行榜

电视盒子是日常生活中最常见的&#xff0c;它有着不可取代的重要地位。每年我们会进行电视盒子的深度测评&#xff0c;最近我们的测评主题是电视盒子什么品牌好&#xff0c;购入了十几个电视盒子品牌旗下的产品&#xff0c;通过对比后总结了电视盒子品牌排行榜&#xff0c;想买…

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文&#xff0c;你可以知道&#xff1a; 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C&#xff0c;也有人用Python。 但是从经验看&#xff0c;用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

详细理解Transformer

上一篇文章中&#xff0c;我们解读了Transformer中的Self-Attention的实现细节&#xff0c;这篇文章中&#xff0c;就Transformer的整体做一个算法解读。 首先&#xff0c;我们还是把Transformer的架构图贴出来&#xff0c;作为本篇内容的抓手。 从图中我们可以看到&#xff0…

迷茫了!去大厂还是创业?

大家好&#xff0c;我是麦叔&#xff0c;最近我创建了一个 学习圈子 有球友在 星球 里提问。 大厂的layout岗位和小厂的硬件工程师岗位&#xff0c;该如何选择&#xff1f; 这个问题我曾经也纠结过&#xff0c;不过现在的我&#xff0c;I am awake&#xff01; 肯定是有大点大。…

2023 年安徽省职业院校技能大赛(高职组)

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

2024长三角快递物流供应链与技术装备展览会(杭州站)

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 指导单位 国家邮政局发展研究中心浙江省邮政管理局中国快递协会 承办单位 上海信世展览服务有限公司 主办单位 浙江…

使用 pg_profile 在 Postgres 中生成性能分析报告

前言&#xff1a; postgres数据库中拥有大量的辅助插件用于帮助DBA更好的分析数据库性能或整个集群&#xff0c;包括索引、I/O、CPU和内存等&#xff0c;pg_profile是基于PostgreSQL标准统计信息视图的诊断工具&#xff0c;它类似于Oracle AWR架构&#xff0c;和Oracle一样&am…

MFC 添加MFC类方法

1、打开工程目录的"类视图" 2、工程名右键添加"MFC类" 3、填写"类名"并选择“基类”CDialog&#xff0c;对话框ID填写添加好的对话框ID

2024(1),Android高分面试指南

以前&#xff0c;见到过挺多这样的新闻&#xff0c;某些学霸&#xff0c;成绩稍微有点下滑之类的&#xff0c;就受不了&#xff0c;做出一些过激的行为。如自杀等。这是非常懦弱的表现。究其背后&#xff0c;这是因为他们把自己蹦的太紧了。就像气球&#xff0c;你憋着一直吹气…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论二】

前言&#xff1a; 本篇主要参考《Wasserstein GAN and the Kantorovich-Rubinstein Duality》 重点介绍一下 WGAN 的损失函数 是如何通过 Wasserstein Distance 变换过来的。 分为5步&#xff1a; 我们首先建立Wasserstein Distance 极小值形式&#xff0c; 经过对…

QGIS 开发之旅二《构建插件工程》

上一篇文章写了二次开发环境的构建&#xff0c;这一章我们从零开始构建插件工程&#xff0c;并理解下QIGIS 如何识别插件程序的。 1、创建QGIS 工程 新建项目&#xff0c;选择下面的空工程 工程创建成功后&#xff0c;是下面的样子&#xff0c;没有任何文件 2、配置QGIS工程 …

掼蛋-掌握出牌权

掼蛋游戏中&#xff0c;出牌权往往能决定一局牌的走向&#xff0c;掌握出牌权可以主动控制局势。出牌权是指在每一轮的出牌环节中谁先出牌。出牌权的重要性主要体现在以下两个方面&#xff1a; 一、控制节奏 出牌权可以让我们主动控制游戏的节奏&#xff0c;可以根据自己的出牌…