数据结构入门(C语言版)图的概念和功能函数实现
2024.01.17 23:33浏览量:11简介:本文将介绍图的基本概念、图的表示和常用操作,以及如何在C语言中实现图的数据结构。通过实例和代码,帮助读者更好地理解图的应用和实现方法。
千帆应用开发平台“智能体Pro”全新上线 限时免费体验
面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用
立即体验
在计算机科学中,图(Graph)是一种常用的数据结构,用于表示对象之间的关系。图由节点(顶点)和边组成,节点表示对象,边表示对象之间的关系。图在许多领域都有广泛应用,如社交网络、交通路线、网络路由等。
一、图的表示
图的表示方法有多种,其中最常用的是邻接矩阵和邻接表。
- 邻接矩阵:用一个二维数组表示图,矩阵的行数和列数分别表示节点的数量。如果节点i与节点j之间存在一条边,则矩阵的第i行第j列的元素为1,否则为0。邻接矩阵的优点是表示简单明了,缺点是空间利用率较低。
- 邻接表:用一个链表表示图,每个节点包含一个链表,链表中的元素是与该节点相邻的节点。邻接表的优点是空间利用率较高,缺点是表示不如邻接矩阵直观。
二、图的常用操作 - 添加节点:向图中添加一个新的节点。
- 删除节点:从图中删除一个已经存在的节点及其所有相关的边。
- 添加边:向图中添加一条新的边,连接两个节点。
- 删除边:从图中删除一条已经存在的边。
- 遍历图:按照一定的规则访问图中的所有节点和边。常见的遍历方式有深度优先遍历(DFS)和广度优先遍历(BFS)。
三、图的C语言实现
下面是一个简单的C语言实现,使用邻接表表示图,并实现了添加节点、添加边、删除边和遍历图等基本操作。
```cinclude
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)。在大多数应用中,我们只删除一个特定的边的操作更为常见,因此这个函数提供了一个优化。如果需要删除(目标节点)的所有邻接,则可以使用一个循环来调用这个函数。如果需要删除(源节点)的所有邻接,则需要一个不同的函数,因为我们需要先找到所有邻接的指针,然后

发表评论
登录后可评论,请前往 登录 或 注册