c语言编写一个程序,实现图的遍历运算,并在此基础上设计一个主程序完成以下功能: 1.输出如图7-18所示有向图G从顶点0开始的深度优先遍历序列 2.输出如图7-18所示有向图G从顶点0开始的广度优先遍历序列。
时间: 2024-12-23 16:15:32 浏览: 5
在C语言中,我们可以使用邻接矩阵或邻接表来表示图,并通过栈(对于深度优先搜索,DFS)或队列(对于广度优先搜索,BFS)的数据结构来实现遍历。下面是一个简单的示例,演示了如何使用邻接表来实现这两种遍历算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 图的节点结构体
typedef struct Node {
int vertex;
struct Node* next; // 邻接表的下一个节点指针
} Node;
// 创建新节点
Node* createNode(int vertex) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = vertex;
newNode->next = NULL;
return newNode;
}
// 添加边到邻接表
void addEdge(Node** adjList, int src, int dest) {
Node* newNode = createNode(dest);
newNode->next = adjList[src];
adjList[src] = newNode;
}
// 深度优先搜索(DFS)
void DFS(Node** adjList, int start, int visited[]) {
printf("%d ", start); // 输出当前节点
visited[start] = 1;
Node* temp = adjList[start];
while (temp != NULL) {
if (!visited[temp->vertex]) {
DFS(adjList, temp->vertex, visited);
}
temp = temp->next;
}
}
// 广度优先搜索(BFS)
void BFS(Node** adjList, int start) {
int visited[100] = {0}; // 初始化所有节点未访问
printf("%d ", start); // 输出起始节点
Queue q; // 用数组实现简单队列
q.enqueue(start);
while (!q.isEmpty()) {
int current = q.dequeue();
Node* temp = adjList[current];
while (temp != NULL) {
int dest = temp->vertex;
if (!visited[dest]) {
printf("%d ", dest);
visited[dest] = 1;
q.enqueue(dest);
}
temp = temp->next;
}
}
}
int main() {
// 假设我们有一个邻接列表表示的图,这里仅做简化的例子,实际需要根据图的结构填充
int V = 5;
Node** adjList = (Node**)malloc(V * sizeof(Node*));
// 初始化邻接列表,添加图的具体信息...
// ...
// 调用函数
int visited[] = {0};
DFS(adjList, 0, visited);
printf("\nDepth First Search: ");
// 清理并重置邻接列表
// ...
BFS(adjList, 0);
printf("\nBreadth First Search: ");
// 清理内存
for (int i = 0; i < V; i++) {
free(adjList[i]);
}
free(adjList);
return 0;
}
```
注意,这只是一个基本的实现,实际应用中可能需要根据具体的图结构数据存储方式进行调整。此外,这个例子并没有处理图的输入和输出,你需要提供一个适当的方式来初始化邻接列表,并读取图的输入。
阅读全文