C语言数据结构与算法-图的实现

一、介绍
图是数据结构中稍微复杂一点的数据结构,在平时的地图中就有广泛的应用
图 常用的表示方法
邻接矩阵表示法
邻接表表示法
十字链表表示法
临界多重表表示法

邻接表表示图
在这里插入图片描述
邻接矩阵表示图
在这里插入图片描述
二、代码实现
邻接表实现图
1、结构定义

//邻接表实现 
#define VERTEX_NUM 10
//边节点 
typedef struct arc_node{
	int adjvex;
	float weight;
	struct arc_node *next_arc;
}arc_node_def;

//头节点 
typedef struct vertex_node{
	char info[10];
	arc_node_def *arc_node;
}vertex_node_def;

//领接表
typedef struct {
	vertex_node_def adjlist[VERTEX_NUM];
	int vertex_num; //节点数 
	int arc_num;	//边数 
}adj_list_graph_def; 

2、操作
1)创建

adj_list_graph_def *create_graph()
{
	int i,j;
	short tmp,tmp1;
	adj_list_graph_def *g;
	arc_node_def *arc_node_tmp,*arc_node_cur;
	
	g = (adj_list_graph_def *)malloc(sizeof(adj_list_graph_def));
	
	printf("请输入顶点数和边数:\n");
	scanf("%d%d", &g->vertex_num, &g->arc_num);
	printf("顶点数和边数: %d %d\n",g->vertex_num, g->arc_num);
	for(i = 0; i < g->vertex_num; i++)
	{
		printf("请输入顶点%d信息:\n", i);
		scanf("%s", g->adjlist[i].info);
		g->adjlist[i].arc_node = NULL;
	}
	
	for(i = 0; i < g->vertex_num; i++)
	{
		printf("请输入顶点%d的边数:\n", i);
		scanf("%d", &tmp1);
		for(j = 0; j < tmp1; j++)
		{
			printf("请输入顶点%d的边线:\n", i);
			scanf("%d", &tmp);
			{
			 	arc_node_tmp = (arc_node_def *)malloc(sizeof(arc_node_def));
			 	arc_node_tmp->adjvex = tmp;
			 	if(g->adjlist[i].arc_node == NULL)
			 	{
				 	g->adjlist[i].arc_node = arc_node_tmp;
				 	arc_node_cur = arc_node_tmp;
				}		
			 	else
			 	{
				 	arc_node_cur->next_arc = arc_node_tmp;
				 	arc_node_cur = arc_node_cur->next_arc;
				 	arc_node_cur->next_arc = NULL;
				}
			}
	
		}
	}
	
	return g;
}

2)访问
深度优先访问 DFS

广度优先访问BFS

最小生成树 (Minimum Spanning Tree)

M并查集 (Union Find Set)

最短路径算法
单源最短路径算法——迪杰斯特拉算法(Dijkstra Algorithm)

多源最短路径算法——弗洛伊德算法(Floyd Algorithm)

三、全部代码

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

//邻接表实现 
#define VERTEX_NUM 10
//边节点 
typedef struct arc_node{
	int adjvex;
	float weight;
	struct arc_node *next_arc;
}arc_node_def;

//头节点 
typedef struct vertex_node{
	char info[10];
	arc_node_def *arc_node;
}vertex_node_def;

//领接表
typedef struct {
	vertex_node_def adjlist[VERTEX_NUM];
	int vertex_num; //节点数 
	int arc_num;	//边数 
}adj_list_graph_def; 

adj_list_graph_def *create_graph()
{
	int i,j;
	short tmp,tmp1;
	adj_list_graph_def *g;
	arc_node_def *arc_node_tmp,*arc_node_cur;
	
	g = (adj_list_graph_def *)malloc(sizeof(adj_list_graph_def));
	
	printf("请输入顶点数和边数:\n");
	scanf("%d%d", &g->vertex_num, &g->arc_num);
	printf("顶点数和边数: %d %d\n",g->vertex_num, g->arc_num);
	for(i = 0; i < g->vertex_num; i++)
	{
		printf("请输入顶点%d信息:\n", i);
		scanf("%s", g->adjlist[i].info);
		g->adjlist[i].arc_node = NULL;
	}
	
	for(i = 0; i < g->vertex_num; i++)
	{
		printf("请输入顶点%d的边数:\n", i);
		scanf("%d", &tmp1);
		for(j = 0; j < tmp1; j++)
		{
			printf("请输入顶点%d的边线:\n", i);
			scanf("%d", &tmp);
			{
			 	arc_node_tmp = (arc_node_def *)malloc(sizeof(arc_node_def));
			 	arc_node_tmp->adjvex = tmp;
			 	if(g->adjlist[i].arc_node == NULL)
			 	{
				 	g->adjlist[i].arc_node = arc_node_tmp;
				 	arc_node_cur = arc_node_tmp;
				}		
			 	else
			 	{
				 	arc_node_cur->next_arc = arc_node_tmp;
				 	arc_node_cur = arc_node_cur->next_arc;
				 	arc_node_cur->next_arc = NULL;
				}
			}
	
		}
	}
	
	return g;
}

void create_graph_test()
{
	adj_list_graph_def *graph;
	
	printf("create_graph_test\n");
	graph = create_graph();
}
  
int main()
{
	create_graph_test();
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值