c语言实现图的存储结构邻接表
时间: 2023-11-05 20:49:44 浏览: 99
在C语言中,可以使用结构体和指针来实现图的存储结构邻接表。邻接表是图的一种常用存储结构,由表头结点和表结点两部分组成。表头结点存储图的各个顶点,而表结点则用单向链表存储每个顶点的相邻顶点,从而表示图的边。
下面是一个C语言实现邻接表的示例代码:
```c
// 定义邻接表的结点结构
struct Node {
int data; // 存储相邻顶点的数据
struct Node* next; // 指向下一个结点的指针
};
// 定义邻接表的表头结点结构
struct Head {
int vertex; // 存储顶点的信息
int flag; // 判断该顶点是否被访问过的标志
struct Node* head_ele; // 指向链表的指针,存储相邻顶点的信息
};
// 定义图的结构体
struct Map {
int vex; // 存储图的顶点数
int edge; // 存储图的边数
int tag; // 存储图的其他信息
struct Head* head; // 指向表头结点数组的指针
};
// 初始化邻接表
struct Map* initMap(int vex, int edge, int tag) {
struct Map* map = (struct Map*)malloc(sizeof(struct Map));
map->vex = vex;
map->edge = edge;
map->tag = tag;
map->head = (struct Head*)malloc(vex * sizeof(struct Head));
for (int i = 0; i < vex; i++) {
map->head[i].vertex = i; // 初始化表头结点的顶点信息
map->head[i].flag = 0; // 初始化访问标志
map->head[i].head_ele = NULL; // 初始化链表为空
}
return map;
}
// 添加边到邻接表
void addEdge(struct Map* map, int start, int end) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = end; newNode->next = map->head[start].head_ele;
map->head[start].head_ele = newNode;
}
// 打印邻接表
void printMap(struct Map* map) {
for (int i = 0; i < map->vex; i++) {
printf("顶点 %d 的相邻顶点:", map->head[i].vertex);
struct Node* node = map->head[i].head_ele;
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
}
// 主函数示例
int main() {
struct Map* map = initMap(5, 7, 0); // 创建一个包含5个顶点和7条边的图
addEdge(map, 0, 1); // 添加边 0->1
addEdge(map, 0, 2); // 添加边 0->2
addEdge(map, 1, 3); // 添加边 1->3
addEdge(map, 1, 4); // 添加边 1->4
addEdge(map, 2, 3); // 添加边 2->3
addEdge(map, 2, 4); // 添加边 2->4
addEdge(map, 3, 4); // 添加边 3->4
printMap(map); // 打印邻接表
return 0;
}
```
上述代码中,使用了两个结构体`Node`和`Head`来分别表示邻接表的结点和表头结点。通过调用`initMap`函数可以初始化一个图,并通过`addEdge`函数来添加边到邻接表中。最后,使用`printMap`函数可以打印出邻接表的内容。这样就实现了C语言中邻接表的图存储结构。
阅读全文