数据结构笔记(一)—— C语言实现邻接矩阵存储的无向图,判断是否为连通图,并且实现最小生成树Prim算法

今天花了很多时间去实现学校布置的作业,所以我突然想到我是否可以将这些经历写到网络上,以便更好的分享出去

本次实现的具体内容是:用C语言实现邻接矩阵存储的无向图,判断是否为连通图,并且实现最小生成树Prim算法

(引用的话不重要)在此之前已经有过一段开发基础了,但大部分都是用C++和其他语言,而用C语言很少,主要原因是其太灵活并且自身觉得困难,努力完成了上述内容后,我忽然发现其实也还好,无非就是需要思考的事情多了。

参考上述要求,我使用了并查集实现图是否为连通图,使用了堆排序(优先队列)实现了Prim算法。其实这些在C++当中很简单,但是使用C语言就很麻烦,需要手动实现。具体整体逻辑如下

  1. 无向图部分

使用结构体定义
其中有很多实现方法。其中最核心的是UG_IsConnectedGraph()是否为连通图、UG_GetMST()获取最小生成树。这俩分别使用到了并查集与堆排序。下方是无向图部分代码,并查集和堆排序在后面

/*以下无向图定义*/
const int INF = 1e9; //代表邻接表未连接
struct UG {
    //无向带权图 Undirected Graph
	int n;//元素个数
	int* s; //邻接矩阵,动态创建
};
typedef UG* UGPoi;

UGPoi UG_Init(int n);//创建无向图
void UG_Link(UGPoi ug, int p, int q, int val);//将两条边连接起来
void UG_PrintGraph(UGPoi ug);//打印图(邻接矩阵)
bool UG_IsConnectedGraph(UGPoi ug);//是否是连通图
UGPoi UG_GetMST(UGPoi ug);//获取最小生成树
struct __UG_HeapNode {
    //UG_GetMST()函数中需使用到的类型
        //边长,目标结点,原始节点
	int len, poi, fro; 
};
void* __UG_getheapnode(int fro, int poi, int len);//创建__UG_HeapNode结构体
bool __UG_heapcompare(void* a, void* b);//堆排序比较函数




/*其中实现如下*/
UGPoi UG_Init(int n) {
   
	//申请UG结构体内存
	UGPoi ug = (UGPoi)malloc(sizeof(UG));
	//为s创建n*n的邻接矩阵空间
	ug->s = (int*)malloc(sizeof(int) * n * n);
	for (int i = 0;i < n;i++)for (int j = 0;j < n;j++)
		ug->s[i * n + j] = INF;
	for (int i = 0;i < n;i++)ug->s[i * n + i] = 0;
	ug->n = n;
	return ug;
}
void UG_Link(UGPoi ug, int p, int q, int val) {
   
	p--;q--;
	ug->s[p * ug->n + q] = val;
	ug->s[q * ug->n + p] = val;
}
void UG_PrintGraph(UGPoi ug) {
   
	printf("(∞表示没有连接)\n");
	int n = ug->n;
	for (int i = 0;i < n;i++) {
   
		for (int j = 0
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值