利用C语言编程实现图的建立(邻接矩阵表示法和邻接表表示法)、图的两种遍历过程,参见教材算法6.1-6.6。要求:在主函数使用菜单形式调用各操作。
时间: 2024-12-23 12:15:48 浏览: 9
在C语言中,我们可以使用邻接矩阵和邻接表两种数据结构来表示图。以下是基本的实现步骤:
**邻接矩阵表示法:**
邻接矩阵是一个二维数组,其中A[i][j]表示顶点i到顶点j是否有边连接。如果存在,则值为1(通常用非零值表示),否则为0。
```c
typedef struct {
int *adj; // 存储邻接矩阵的数组
int numVertices; // 图中顶点数
} AdjMatrixGraph;
void initAdjMatrixGraph(AdjMatrixGraph* graph, int vertices) {
graph->adj = malloc(vertices * sizeof(int)); // 分配内存
for (int i = 0; i < vertices; ++i) {
graph->adj[i] = malloc(vertices * sizeof(int));
memset(graph->adj[i], 0, vertices);
}
}
// 添加边
void addEdge(AdjMatrixGraph* graph, int src, int dest) {
graph->adj[src][dest] = 1;
graph->adj[dest][src] = 1; // 对称图,需要双向添加
}
```
**邻接表表示法:**
邻接表是一种链表形式的数据结构,每个顶点都有一个链表,链表中的节点存储与其相邻的所有顶点及其权重。
```c
typedef struct Node {
int vertex;
struct Node* next;
} Node;
typedef struct {
Node** adjList; // 链表指针数组
int numVertices;
} AdjListGraph;
void initAdjListGraph(AdjListGraph* graph, int vertices) {
graph->adjList = malloc(vertices * sizeof(Node*));
for (int i = 0; i < vertices; ++i) {
graph->adjList[i] = NULL;
}
}
// 添加边
void addEdge(AdjListGraph* graph, int src, int dest) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = dest;
newNode->next = graph->adjList[src];
graph->adjList[src] = newNode;
}
```
**图的遍历:**
1. **深度优先搜索(DFS)**: 从一个顶点开始,尽可能深地探索分支,直到到达叶子节点或无路可走,然后回溯寻找其他路径。
2. **广度优先搜索(BFS)**: 从根节点开始,逐层遍历所有邻居,然后再访问它们的邻居。
在主函数中,可以设计一个循环菜单,让用户选择操作,如创建图、添加边、深度优先遍历、广度优先遍历等,并根据用户的选择调用相应的函数实现。
阅读全文