图深度优先遍历的非递归实现

本文介绍了一种采用非递归方法实现的图的深度优先遍历算法,通过使用栈来替代递归调用,实现了图的深度优先搜索。文章详细展示了算法的实现过程,包括创建图的邻接表表示、初始化栈和访问标记,以及遍历图的各个顶点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 采用非递归方法实现图的深度优先遍历

//
//  GraphDFSNonRecursion.c
//  
//
//  Created by yanbinbin
//

#include <stdio.h>
#include <stdlib.h>
#define maxSize 20

typedef struct ArcNode{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct{
    char data;
    struct ArcNode *firstarc;
}VNode;

typedef struct{
    VNode adjlist[maxSize];
    int n, e;
}AGraph;

void createGraph(AGraph *G){
    int i, tail, head, edges, vertex;
    ArcNode *tmp, *p;
    printf("请输入图的顶点数:");
    scanf("%d", &vertex);
    printf("请输入图的边数:");
    scanf("%d", &edges);
    
    G->n = vertex;
    G->e = edges;
    
    for (i = 1; i <= edges; ++i) {
        printf("请输入第%d条边的弧尾与弧头\n", i);
        printf("弧尾: ");
        scanf("%d", &tail);
        printf("弧头: ");
        scanf("%d", &head);
        p = (ArcNode *)malloc(sizeof(ArcNode));
        p->adjvex = head;
        p->nextarc = NULL;
        //建立邻接表
        tmp = G->adjlist[tail].firstarc;
        if(tmp == NULL)
            G->adjlist[tail].firstarc = p;
        else{
            while (tmp->nextarc != NULL)
                tmp = tmp->nextarc;
            tmp->nextarc = p;
        }
    }
    printf("图建立完毕\n");
}

void DFSNonRecursion(AGraph *G, int v){
    printf("图DFS开始\n");
    int stack[maxSize];
    int top = -1;
    int visit[maxSize];
    int i, j, k;
    ArcNode *p;
    
    for (i = 0; i < maxSize; ++i)
        visit[i] = 0;
    
    printf("%d  ", v);
    visit[v] = 1;
    stack[++top] = v;
    while (top != -1) {
        j = stack[top];
        p = G->adjlist[j].firstarc;
        while (p != NULL) {
            while (p != NULL && visit[p->adjvex] == 1)
                p = p->nextarc;
            if(p == NULL)
                break;
            k = p->adjvex;
            stack[++top] = k;
            visit[k] = 1;
            printf("%d  ", k);
            p = G->adjlist[k].firstarc;
        }
        --top;
    }
    printf("\n图DFS完毕\n");
}

int main(){
    AGraph G;
    createGraph(&G);
    DFSNonRecursion(&G, 0);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值