创建图的邻接矩阵,设计算法自动生成邻接表,生成C语言代码
时间: 2023-06-27 18:01:29 浏览: 164
图的邻接表(c语言 算法 程序)
4星 · 用户满意度95%
创建图的邻接矩阵:
假设有一个无向图,有n个节点和m条边,我们可以用一个n*n的矩阵来表示这个图,称之为邻接矩阵。其中第i行第j列的元素表示节点i到节点j是否有边相连,如果相连,那么为1,否则为0。
例如,下面是一个无向图的邻接矩阵:
```
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 1
3 1 0 0 1 0
4 0 1 1 0 1
5 0 1 0 1 0
```
设计算法自动生成邻接表
邻接表是图的另一种表示方式。对于每个节点,我们用一个链表来表示它所连接的其他节点。因此,对于一个有n个节点和m条边的图,邻接表的长度是m+2n。
生成邻接表的算法如下:
1. 首先创建一个长度为n的链表数组adj_list,代表每个节点的邻接表。
2. 遍历邻接矩阵,对于每个节点i,遍历它所连接的其他节点j(j>i)。
3. 对于每个连接节点j,创建一个新的邻接表节点,并将其插入到节点i的邻接表中。
4. 将节点j也加入到节点i的邻接表中(因为是无向图)。
5. 重复2-4,直到遍历完所有节点。
生成C语言代码
下面是生成C语言代码的算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 1000
// 邻接表节点
typedef struct _adj_list_node {
int dest; // 连接的节点
struct _adj_list_node* next; // 下一个邻接表节点
} adj_list_node;
// 邻接表
typedef struct _adj_list {
adj_list_node* head; // 邻接表头
} adj_list;
// 图
typedef struct _graph {
int num_nodes; // 节点数
adj_list* adj_lists; // 邻接表数组
} graph;
// 创建邻接表节点
adj_list_node* create_adj_list_node(int dest) {
adj_list_node* node = (adj_list_node*)malloc(sizeof(adj_list_node));
node->dest = dest;
node->next = NULL;
return node;
}
// 添加边
void add_edge(graph* g, int src, int dest) {
adj_list_node* node = create_adj_list_node(dest);
node->next = g->adj_lists[src].head;
g->adj_lists[src].head = node;
node = create_adj_list_node(src);
node->next = g->adj_lists[dest].head;
g->adj_lists[dest].head = node;
}
// 创建图
graph* create_graph(int num_nodes, int** edges, int num_edges) {
graph* g = (graph*)malloc(sizeof(graph));
g->num_nodes = num_nodes;
g->adj_lists = (adj_list*)malloc(num_nodes * sizeof(adj_list));
for (int i = 0; i < num_nodes; i++) {
g->adj_lists[i].head = NULL;
}
for (int i = 0; i < num_edges; i++) {
int src = edges[i][0];
int dest = edges[i][1];
add_edge(g, src, dest);
}
return g;
}
// 打印邻接表
void print_graph(graph* g) {
for (int i = 0; i < g->num_nodes; i++) {
printf("%d: ", i);
adj_list_node* node = g->adj_lists[i].head;
while (node != NULL) {
printf("%d ", node->dest);
node = node->next;
}
printf("\n");
}
}
int main() {
int num_nodes = 5;
int edges[][2] = {{0, 1}, {0, 2}, {1, 3}, {1, 4}, {2, 3}, {3, 4}};
int num_edges = sizeof(edges) / sizeof(edges[0]);
graph* g = create_graph(num_nodes, edges, num_edges);
print_graph(g);
return 0;
}
```
阅读全文