非递归深度优先遍历算法

当然是伪码,自己在纸上模拟了一遍是没错的。如果发现什么错误欢迎指正。

N_DFS(gragh g, int i){
    int j;
    seqstack s;
    INITSTACK(s);
    while(!EMPTY(s)){
        if(visited[i] == 0){
            visited[i] = 1;
            printf(g.vexs[i]);
        }
        for(j = 0; j != n;++j)
            if((g.arcs[i][j] == 1) && (!visited[j])){
                PUSH(s,j);
              
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵是表示图的一种方式,深度优先是指不使用算法来实现深度优先。下面是C语言实现邻接矩阵深度优先的步骤: 1. 定义一个栈结构,用于存储待遍的节点。 2. 定义一个visited数组,用于记录每个节点是否已经被遍。 3. 从某个起始节点开始,将其压入栈中,并将visited数组中对应位置标记为已访问。 4. 循环执行以下步骤直到栈为空: a. 取出栈顶元素,并输出该节点。 b. 遍该节点的所有邻居节点,若该邻居节点未被访问,则将其压入栈中并标记为已访问。 下面是邻接矩阵深度优先的C语言实现代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 typedef int VertexType; typedef int EdgeType; typedef struct { VertexType vertex[MAX_VERTEX_NUM]; EdgeType edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertex_num, edge_num; } MGraph; typedef struct { VertexType data[MAX_VERTEX_NUM]; int top; } Stack; void InitStack(Stack *S) { S->top = -1; } void Push(Stack *S, VertexType x) { S->data[++S->top] = x; } VertexType Pop(Stack *S) { return S->data[S->top--]; } int IsEmpty(Stack *S) { return S->top == -1; } void CreateGraph(MGraph *G) { int i, j; printf("请输入图的顶点数和边数:\n"); scanf("%d %d", &G->vertex_num, &G->edge_num); printf("请输入各个顶点:\n"); for (i = 0; i < G->vertex_num; i++) { scanf("%d", &G->vertex[i]); } for (i = 0; i < G->vertex_num; i++) { for (j = 0; j < G->vertex_num; j++) { G->edge[i][j] = 0; } } printf("请输入各条边的起点和终点:\n"); for (i = 0; i < G->edge_num; i++) { int u, v; scanf("%d %d", &u, &v); G->edge[u][v] = G->edge[v][u] = 1; } } void DFS(MGraph *G, int v, int visited[]) { Stack S; InitStack(&S); Push(&S, v); visited[v] = 1; while (!IsEmpty(&S)) { int i, w = Pop(&S); printf("%d ", G->vertex[w]); for (i = 0; i < G->vertex_num; i++) { if (G->edge[w][i] && !visited[i]) { Push(&S, i); visited[i] = 1; } } } } void DFSTraverse(MGraph *G) { int visited[MAX_VERTEX_NUM] = {0}; int i; for (i = 0; i < G->vertex_num; i++) { if (!visited[i]) { DFS(G, i, visited); } } } int main() { MGraph G; CreateGraph(&G); DFSTraverse(&G); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值