《数据结构-C语言实现图(Graph)》

图(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;
}

猜你喜欢

转载自blog.csdn.net/Like_Bamboo/article/details/129683515