图(Graph)是由节点(Vertex)和边(Edge)组成的数据结构。在C语言中,我们可以使用邻接矩阵或邻接表来表示图。
邻接矩阵是一个二维数组,其中每个元素代表一条边的权重。如果存在一条从节点i到节点j的边,那么在邻接矩阵中,第i行第j列的元素为非零值;否则,该元素为零。邻接矩阵可以快速地进行图的访问和修改操作,但是当图非常稀疏时,邻接矩阵会浪费大量的空间。
邻接表是一种链式数据结构,其中每个节点包含一个值和一个指向其相邻节点的指针。每个节点的相邻节点可以存储在一个数组或链表中。邻接表在存储稀疏图时比较节省空间,但是在访问或修改操作时可能需要进行线性搜索,效率较低。
下面是使用邻接表实现无向图的代码示例:
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
typedef struct node {
int vertex;
struct node* next;
} Node;
typedef struct graph {
int num_vertices;
Node* adj_list[MAX_VERTICES];
} Graph;
Node* create_node(int v) {
Node* node = (Node*) malloc(sizeof(Node));
node->vertex = v;
node->next = NULL;
return node;
}
Graph* create_graph(int num_vertices) {
Graph* graph = (Graph*) malloc(sizeof(Graph));
graph->num_vertices = num_vertices;
for (int i = 0; i < num_vertices; i++) {
graph->adj_list[i] = NULL;
}
return graph;
}
void add_edge(Graph* graph, int src, int dest) {
Node* node = create_node(dest);
node->next = graph->adj_list[src];
graph->adj_list[src] = node;
node = create_node(src);
node->next = graph->adj_list[dest];
graph->adj_list[dest] = node;
}
void print_graph(Graph* graph) {
for (int i = 0; i < graph->num_vertices; i++) {
Node* node = graph->adj_list[i];
printf("Vertex %d: ", i);
while (node) {
printf("%d -> ", node->vertex);
node = node->next;
}
printf("NULL\n");
}
}
int main() {
Graph* graph = create_graph(4);
add_edge(graph, 0, 1);
add_edge(graph, 0, 2);
add_edge(graph, 1, 2);
add_edge(graph, 2, 3);
print_graph(graph);
return 0;
}