实验4:图的存储及其应用 (1)图的邻接矩阵表示创建无向图算法; (2)图的邻接表表示创建无向图算法; 用c语言完成以上实验及要求
时间: 2024-12-28 13:41:24 浏览: 18
实验4主要探讨的是图数据结构的两种常见表示方法——邻接矩阵和邻接表,并通过C语言实现它们在无向图创建过程中的应用。
**1. 邻接矩阵表示:**
邻接矩阵是一个二维数组,其中行代表源节点,列代表目标节点,元素值表示两个节点之间的边是否存在。对于无向图,通常对称地存储每个节点的出度和入度信息。创建无向图的算法步骤可以分为以下几步:
- 初始化一个大小为节点数的平方的布尔型数组,初始化所有元素为false。
- 对于每条边 (u, v),在邻接矩阵的第u行第v列和第v行第u列设置为true,表示节点u和v之间有边。
**2. 邻接表表示:**
邻接表是一种链式数据结构,每个节点维护一个链表,链表中的每个元素对应与该节点相连的所有邻居。创建无向图的邻接表算法:
- 使用一个哈希表或动态数组,键为节点,值为指向邻接节点列表的指针。
- 对于每条边 (u, v),检查u是否已经在邻接表中,如果不在,则添加一个新的链表并将v添加进去;如果已在,直接将v添加到链表中。
**C语言实现:**
你需要分别编写函数来处理这两种情况。例如,邻接矩阵可以用二维数组`adjMatrix[]`表示,邻接表可以用`node* adjList[]`和`int nodeCount`记录节点和链表长度。具体的代码会包括输入节点和边的数据,以及构建和查询图的操作。
```c
// 假设我们已经有了创建邻接矩阵和邻接表的基本函数
void createAdjMat(int nodes, int edges[], int adjMatrix[]) {
// 省略实际的创建过程
}
void createAdjList(int nodes, int edges[], node* adjList[], int* nodeCount) {
// 省略实际的创建过程
}
// 示例调用:
int main() {
int nodes = 5; // 假设有5个节点
int edges[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4}; // 边的信息
int adjMatrix[5][5]; // 邻接矩阵
node* adjList[5]; // 邻接表
int nodeCount;
createAdjMat(nodes, edges, adjMatrix);
createAdjList(nodes, edges, adjList, &nodeCount);
// 更多的查询、操作等...
return 0;
}
```
阅读全文