用c语言1.基于邻接表构建三国人物关系图,并能输出展示邻接表,保存在文件”TRKGraph.txt”中。文件格式如下: 刘备-->张飞--->关羽--->赵云 注意:图的构建,应该先整理图中的顶点数据,即要整理所有三国人物数据作为图顶点。
时间: 2024-03-30 20:33:29 浏览: 78
好的,以下是基于邻接表构建三国人物关系图的C语言代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_VERTEX_NUM 100 // 顶点最大数量
// 定义三国人物结构体
struct person {
char name[20]; // 姓名
char country[20];// 所属国
};
// 定义邻接表节点结构体
struct node {
int adjvex; // 邻接点在顶点数组中的下标
int relation; // 人物之间的关系
struct node *next; // 指向下一个邻接点
};
// 定义顶点结构体
struct vertex {
struct person data; // 顶点数据
struct node *first; // 指向第一个邻接点
};
// 定义邻接表结构体
struct adj_list {
struct vertex vex[MAX_VERTEX_NUM]; // 顶点数组
int vex_num; // 顶点数量
};
// 初始化邻接表
void init_adj_list(struct adj_list *list) {
list->vex_num = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
list->vex[i].first = NULL;
}
}
// 查找顶点在顶点数组中的下标
int find_index(struct adj_list *list, char *name) {
for (int i = 0; i < list->vex_num; i++) {
if (strcmp(list->vex[i].data.name, name) == 0) {
return i;
}
}
return -1;
}
// 添加顶点到邻接表中
void add_vertex(struct adj_list *list, struct person p) {
int i = find_index(list, p.name);
if (i == -1) {
// 顶点不存在,添加到顶点数组中
struct vertex v;
v.data = p;
v.first = NULL;
list->vex[list->vex_num++] = v;
}
}
// 添加边到邻接表中
void add_edge(struct adj_list *list, char *name1, char *name2, int relation) {
int i = find_index(list, name1);
int j = find_index(list, name2);
if (i == -1 || j == -1) {
printf("Error: 人物不存在!\n");
return;
}
// 添加邻接点到链表中
struct node *n = (struct node *)malloc(sizeof(struct node));
n->adjvex = j;
n->relation = relation;
n->next = list->vex[i].first;
list->vex[i].first = n;
}
// 打印邻接表
void print_adj_list(struct adj_list *list) {
FILE *fp = fopen("TRKGraph.txt", "w");
for (int i = 0; i < list->vex_num; i++) {
printf("%s-->", list->vex[i].data.name);
fprintf(fp, "%s-->", list->vex[i].data.name);
struct node *p = list->vex[i].first;
while (p != NULL) {
printf("%s-->", list->vex[p->adjvex].data.name);
fprintf(fp, "%s-->", list->vex[p->adjvex].data.name);
p = p->next;
}
printf("NULL\n");
fprintf(fp, "NULL\n");
}
fclose(fp);
}
int main() {
struct adj_list list;
init_adj_list(&list);
// 添加顶点
struct person p1 = {"刘备", "蜀国"};
struct person p2 = {"关羽", "蜀国"};
struct person p3 = {"张飞", "蜀国"};
struct person p4 = {"赵云", "蜀国"};
struct person p5 = {"曹操", "魏国"};
struct person p6 = {"张辽", "魏国"};
struct person p7 = {"夏侯惇", "魏国"};
add_vertex(&list, p1);
add_vertex(&list, p2);
add_vertex(&list, p3);
add_vertex(&list, p4);
add_vertex(&list, p5);
add_vertex(&list, p6);
add_vertex(&list, p7);
// 添加边
add_edge(&list, "刘备", "张飞", 1);
add_edge(&list, "张飞", "关羽", 2);
add_edge(&list, "关羽", "赵云", 3);
add_edge(&list, "曹操", "张辽", 4);
add_edge(&list, "张辽", "夏侯惇", 5);
// 打印邻接表
print_adj_list(&list);
return 0;
}
```
运行程序后,会输出每个人物的邻接点及其关系,同时将邻接表保存在"TRKGraph.txt"文件中。
阅读全文