使用C语言编程实现一个有菜单的图的邻接矩阵和邻接表两种存储结构;
时间: 2024-05-07 08:21:17 浏览: 100
数据结构学习--图的邻接矩阵和邻接表存储
以下是使用C语言编程实现的有菜单的图的邻接矩阵和邻接表两种存储结构的代码,包括创建图、添加边、打印图等基本操作:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
/* 存储结构 */
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边
int vertex_num; // 顶点数
int edge_num; // 边数
} MatrixGraph;
typedef struct EdgeNode {
int adjvex; // 邻接点下标
struct EdgeNode *next; // 指向下一个邻接点
} EdgeNode;
typedef struct VertexNode {
int data; // 顶点数据
EdgeNode *first_edge; // 指向第一个邻接点
} VertexNode;
typedef struct {
VertexNode vertex[MAX_VERTEX_NUM]; // 存储顶点和边
int vertex_num; // 顶点数
int edge_num; // 边数
} ListGraph;
/* 函数声明 */
void create_matrix_graph(MatrixGraph *g);
void create_list_graph(ListGraph *g);
void add_edge_matrix(MatrixGraph *g, int v1, int v2);
void add_edge_list(ListGraph *g, int v1, int v2);
void print_matrix_graph(MatrixGraph g);
void print_list_graph(ListGraph g);
int main() {
int choice;
MatrixGraph m_graph;
ListGraph l_graph;
while (1) {
printf("1. 创建邻接矩阵图\n");
printf("2. 创建邻接表图\n");
printf("3. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
create_matrix_graph(&m_graph);
print_matrix_graph(m_graph);
break;
case 2:
create_list_graph(&l_graph);
print_list_graph(l_graph);
break;
case 3:
exit(0);
default:
printf("输入有误,请重新选择!\n");
break;
}
}
}
/* 创建邻接矩阵图 */
void create_matrix_graph(MatrixGraph *g) {
int i, j, v1, v2;
printf("请输入顶点数和边数:");
scanf("%d%d", &(g->vertex_num), &(g->edge_num));
printf("请输入顶点信息:");
for (i = 0; i < g->vertex_num; i++) {
scanf("%d", &(g->vertex[i]));
}
/* 初始化邻接矩阵 */
for (i = 0; i < g->vertex_num; i++) {
for (j = 0; j < g->vertex_num; j++) {
g->edge[i][j] = 0;
}
}
printf("请输入边的信息:\n");
for (i = 0; i < g->edge_num; i++) {
printf("请输入第 %d 条边的两个顶点下标:", i + 1);
scanf("%d%d", &v1, &v2);
add_edge_matrix(g, v1, v2);
}
}
/* 创建邻接表图 */
void create_list_graph(ListGraph *g) {
int i, j, v1, v2;
EdgeNode *e;
printf("请输入顶点数和边数:");
scanf("%d%d", &(g->vertex_num), &(g->edge_num));
printf("请输入顶点信息:");
for (i = 0; i < g->vertex_num; i++) {
scanf("%d", &(g->vertex[i].data));
g->vertex[i].first_edge = NULL;
}
printf("请输入边的信息:\n");
for (i = 0; i < g->edge_num; i++) {
printf("请输入第 %d 条边的两个顶点下标:", i + 1);
scanf("%d%d", &v1, &v2);
add_edge_list(g, v1, v2);
}
}
/* 添加边到邻接矩阵 */
void add_edge_matrix(MatrixGraph *g, int v1, int v2) {
g->edge[v1][v2] = 1;
g->edge[v2][v1] = 1;
}
/* 添加边到邻接表 */
void add_edge_list(ListGraph *g, int v1, int v2) {
EdgeNode *e;
/* 添加 v2 到 v1 的边 */
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = v2;
e->next = g->vertex[v1].first_edge;
g->vertex[v1].first_edge = e;
/* 添加 v1 到 v2 的边 */
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = v1;
e->next = g->vertex[v2].first_edge;
g->vertex[v2].first_edge = e;
}
/* 打印邻接矩阵图 */
void print_matrix_graph(MatrixGraph g) {
int i, j;
printf("图的邻接矩阵表示如下:\n");
for (i = 0; i < g.vertex_num; i++) {
for (j = 0; j < g.vertex_num; j++) {
printf("%d ", g.edge[i][j]);
}
printf("\n");
}
}
/* 打印邻接表图 */
void print_list_graph(ListGraph g) {
int i;
EdgeNode *e;
printf("图的邻接表表示如下:\n");
for (i = 0; i < g.vertex_num; i++) {
printf("%d: ", g.vertex[i].data);
e = g.vertex[i].first_edge;
while (e != NULL) {
printf("%d ", g.vertex[e->adjvex].data);
e = e->next;
}
printf("\n");
}
}
```
以上代码中,`create_matrix_graph()` 和 `create_list_graph()` 用来创建图,分别对应邻接矩阵和邻接表两种存储结构。`add_edge_matrix()` 和 `add_edge_list()` 用来添加边,分别对应邻接矩阵和邻接表两种存储结构。`print_matrix_graph()` 和 `print_list_graph()` 用来打印图,分别对应邻接矩阵和邻接表两种存储结构。在 `main()` 函数中,通过菜单实现了图的创建、添加边和打印等基本操作。
阅读全文