数据结构入门(C语言版)图的概念和功能函数实现

作者:狼烟四起2024.01.17 23:33浏览量:11

简介:本文将介绍图的基本概念、图的表示和常用操作,以及如何在C语言中实现图的数据结构。通过实例和代码,帮助读者更好地理解图的应用和实现方法。

千帆应用开发平台“智能体Pro”全新上线 限时免费体验

面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用

立即体验

在计算机科学中,图(Graph)是一种常用的数据结构,用于表示对象之间的关系。图由节点(顶点)和边组成,节点表示对象,边表示对象之间的关系。图在许多领域都有广泛应用,如社交网络、交通路线、网络路由等。
一、图的表示
图的表示方法有多种,其中最常用的是邻接矩阵和邻接表。

  1. 邻接矩阵:用一个二维数组表示图,矩阵的行数和列数分别表示节点的数量。如果节点i与节点j之间存在一条边,则矩阵的第i行第j列的元素为1,否则为0。邻接矩阵的优点是表示简单明了,缺点是空间利用率较低。
  2. 邻接表:用一个链表表示图,每个节点包含一个链表,链表中的元素是与该节点相邻的节点。邻接表的优点是空间利用率较高,缺点是表示不如邻接矩阵直观。
    二、图的常用操作
  3. 添加节点:向图中添加一个新的节点。
  4. 删除节点:从图中删除一个已经存在的节点及其所有相关的边。
  5. 添加边:向图中添加一条新的边,连接两个节点。
  6. 删除边:从图中删除一条已经存在的边。
  7. 遍历图:按照一定的规则访问图中的所有节点和边。常见的遍历方式有深度优先遍历(DFS)和广度优先遍历(BFS)。
    三、图的C语言实现
    下面是一个简单的C语言实现,使用邻接表表示图,并实现了添加节点、添加边、删除边和遍历图等基本操作。
    ```c

    include

    include

    define MAX_NODES 100 // 最大节点数

    define MAX_EDGES 1000 // 最大边数

    typedef struct Node {
    int vertex; // 节点编号
    struct Node next; // 指向下一个节点的指针
    } Node;
    typedef struct Graph {
    Node** adjList; // 邻接表数组
    int numVertices; // 节点数量
    } Graph;
    // 创建新节点
    Node
    createNode(int vertex) {
    Node newNode = (Node)malloc(sizeof(Node));
    newNode->vertex = vertex;
    newNode->next = NULL;
    return newNode;
    }
    // 创建新图
    Graph createGraph(int vertices) {
    Graph
    graph = (Graph)malloc(sizeof(Graph));
    graph->adjList = (Node**)malloc(vertices
    sizeof(Node));
    graph->numVertices = vertices;
    for (int i = 0; i < vertices; i++) {
    graph->adjList[i] = NULL;
    }
    return graph;
    }
    // 添加边
    void addEdge(Graph
    graph, int src, int dest) {
    Node* newNode = createNode(dest);
    newNode->next = graph->adjList[src]; // 将新节点插入到src节点的邻接表中
    graph->adjList[src] = newNode; // 更新src节点的邻接表头指针
    }
    // 删除边(源节点)与(目标节点)之间的连接。如果(目标节点)存在于(源节点)的邻接表中,则从表中移除它。否则什么也不做。在O(1)时间复杂度内完成这个操作。如果需要也可以在O(1)时间复杂度内删除(源节点)。在大多数应用中,我们只删除一个特定的边的操作更为常见,因此这个函数提供了一个优化。如果需要删除(目标节点)的所有邻接,则可以使用一个循环来调用这个函数。如果需要删除(源节点)的所有邻接,则需要一个不同的函数,因为我们需要先找到所有邻接的指针,然后才能删除它们。这个函数的时间复杂度是O(1)。在大多数应用中,我们只删除一个特定的边的操作更为常见,因此这个函数提供了一个优化。如果需要删除(目标节点)的所有邻接,则可以使用一个循环来调用这个函数。如果需要删除(源节点)的所有邻接,则需要一个不同的函数,因为我们需要先找到所有邻接的指针,然后
article bottom image

相关文章推荐

发表评论