一、介绍
图是数据结构中稍微复杂一点的数据结构,在平时的地图中就有广泛的应用
图 常用的表示方法
邻接矩阵表示法
邻接表表示法
十字链表表示法
临界多重表表示法
邻接表表示图
邻接矩阵表示图
二、代码实现
邻接表实现图
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;
}