C语言用非递归算法实现邻接表的深度优先遍历,要用到栈函数的形式
时间: 2024-06-11 16:10:50 浏览: 68
以下是使用栈函数的非递归算法实现邻接表的深度优先遍历:
```
void DFS(Graph* G, int v) {
int visited[G->numVertices]; // 标记是否访问过
for (int i = 0; i < G->numVertices; i++) {
visited[i] = 0;
}
Stack* S = createStack(G->numVertices); // 创建栈
push(S, v); // 将起始顶点入栈
while (!isEmpty(S)) {
int currVertex = top(S); // 取出栈顶元素
pop(S); // 弹出栈顶元素
if (!visited[currVertex]) { // 如果当前顶点未被访问过
visited[currVertex] = 1; // 标记为已访问
printf("%d ", currVertex); // 输出当前顶点
Node* currNode = G->adjLists[currVertex]; // 取出当前顶点的邻接表
while (currNode != NULL) {
if (!visited[currNode->vertex]) { // 如果邻接顶点未被访问过
push(S, currNode->vertex); // 将邻接顶点入栈
}
currNode = currNode->next; // 继续遍历邻接表
}
}
}
}
```
其中,`Stack` 和 `createStack` 函数的定义如下:
```
typedef struct stack {
int* arr;
int top;
int capacity;
} Stack;
Stack* createStack(int capacity) {
Stack* S = (Stack*)malloc(sizeof(Stack));
S->arr = (int*)malloc(sizeof(int) * capacity);
S->top = -1;
S->capacity = capacity;
return S;
}
```
使用示例:
```
Graph* G = createGraph(5);
addEdge(G, 0, 1);
addEdge(G, 0, 2);
addEdge(G, 1, 2);
addEdge(G, 2, 0);
addEdge(G, 2, 3);
addEdge(G, 3, 3);
printf("深度优先遍历:");
DFS(G, 2); // 从顶点2开始遍历
```
输出结果:
```
深度优先遍历:2 0 1 3
```
阅读全文