学校地图管理功能。该功能使用图形结构进行数据存储,并实现基本初始化、增加、修改、删除、查找功能。
给你一个简单一点的代码实现吧,下次细节你可以多说一点要求
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define MAX_DESC_LEN 100
#define MAX_VERTEX_NUM 100
// 图形结构体
typedef struct {
char name[MAX_NAME_LEN]; // 地点名称
char desc[MAX_DESC_LEN]; // 地点描述
int x, y; // 地点坐标
} Vertex;
typedef struct {
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
Vertex vertex[MAX_VERTEX_NUM]; // 顶点数组
int vertex_num; // 顶点数量
} Graph;
// 初始化图
void init_graph(Graph *graph) {
graph->vertex_num = 0;
memset(graph->edge, 0, sizeof(graph->edge));
memset(graph->vertex, 0, sizeof(graph->vertex));
}
// 添加顶点
void add_vertex(Graph *graph, Vertex vertex) {
if (graph->vertex_num >= MAX_VERTEX_NUM) {
printf("顶点数量已达到最大值,无法添加新的顶点!\n");
return;
}
graph->vertex[graph->vertex_num++] = vertex;
}
// 添加边
void add_edge(Graph *graph, int from, int to, int weight) {
graph->edge[from][to] = weight;
}
// 修改顶点
void modify_vertex(Graph *graph, int index, Vertex vertex) {
graph->vertex[index] = vertex;
}
// 删除顶点
void delete_vertex(Graph *graph, int index) {
int i, j;
// 删除顶点
for (i = index; i < graph->vertex_num - 1; i++) {
graph->vertex[i] = graph->vertex[i + 1];
}
graph->vertex_num--;
// 删除边
for (i = 0; i < graph->vertex_num; i++) {
for (j = index; j < graph->vertex_num - 1; j++) {
graph->edge[i][j] = graph->edge[i][j + 1];
}
graph->edge[i][graph->vertex_num - 1] = 0;
}
for (j = 0; j < graph->vertex_num; j++) {
for (i = index; i < graph->vertex_num - 1; i++) {
graph->edge[i][j] = graph->edge[i + 1][j];
}
graph->edge[graph->vertex_num - 1][j] = 0;
}
}
// 查找顶点
int find_vertex(Graph *graph, char *name) {
int i;
for (i = 0; i < graph->vertex_num; i++) {
if (strcmp(graph->vertex[i].name, name) == 0) {
return i;
}
}
return -1;
}
// 打印顶点
void print_vertex(Vertex vertex) {
printf("名称:%s,描述:%s,坐标:(%d,%d)\n", vertex.name, vertex.desc, vertex.x, vertex.y);
}
// 打印图
void print_graph(Graph *graph) {
int i, j;
printf("图形结构:\n");
for (i = 0; i < graph->vertex_num; i++) {
print_vertex(graph->vertex[i]);
for (j = 0; j < graph->vertex_num; j++) {
if (graph->edge[i][j] != 0) {
printf("从 %s 到 %s 的距离为:%d\n", graph->vertex[i].name, graph->vertex[j].name, graph->edge[i][j]);
}
}
printf("\n");
}
}
int main() {
Graph graph;
init_graph(&graph);
// 添加顶点
add_vertex(&graph, (Vertex){"教学楼", "这是教学楼", 10, 20});
add_vertex(&graph, (Vertex){"实验楼", "这是实验楼", 30, 40});
add_vertex(&graph, (Vertex){"图书馆", "这是图书馆", 50, 60});
// 添加边
add_edge(&graph, 0, 1, 100);
add_edge(&graph, 0, 2, 200);
add_edge(&graph, 1, 0, 100);
add_edge(&graph, 1, 2, 300);
add_edge(&graph, 2, 0, 200);
add_edge(&graph, 2, 1, 300);
// 打印图
print_graph(&graph);
// 修改顶点
modify_vertex(&graph, 0, (Vertex){"教学楼A", "这是教学楼A", 11, 21});
// 删除顶点
delete_vertex(&graph, 1);
// 查找顶点
int index = find_vertex(&graph, "教学楼A");
if (index != -1) {
print_vertex(graph.vertex[index]);
}
// 打印图
print_graph(&graph);
return 0;
}
数组名字符合标识符的书写规定(数字、英文字母、下划线)
数组名不能与其它变量名相同,同一作用域内是唯一的
方括号[]中常量表达式表示数组元素的个数
定义数组时[]内最好是常量,使用数组时[]内即可是常量,也可以是变量