【图论】实现图的遍历算法

传送门

递归深度优先遍历

#include<stdio.h>
#include<malloc.h>
#define MAXV 100
#define INF 32767
typedef struct ANode
{
    int adjvex;
    int weight;
    struct ANode *nextarc;
} ArcNode;

typedef struct
{
    int count;
    ArcNode *firstarc;
} VNode;

typedef struct
{
    VNode adjlist[MAXV];
    int n, e;
}AdjGraph;

int visit[MAXV] = { 0 };

void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e);
void DFS(AdjGraph *G, int v);

int main()
{
    AdjGraph * G;
    int n = 6, e = 10;
    int A[MAXV][MAXV] = { { 0, 5, INF, 7, INF, INF },
    { INF, 0, 4, INF, INF, INF },{ 8, INF, 0, INF, INF, 9 },
    { INF, INF, 5, 0, 5 },{ INF, INF, INF, 5, 0, INF },{ 3, INF, INF, INF, 1, 0 } };
    CreateAdj(G, A, n, e);
    printf("从0开始的DFS算法: ");
    DFS(G, 0);
    printf("\n");
    return 0;
}

void DFS(AdjGraph *G, int v) //递归深度优先遍历算法
{
    ArcNode *p;
    printf("%d ", v);
    visit[v] = 1;
    p = G->adjlist[v].firstarc;
    while (p != NULL)
    {
        if (visit[p->adjvex] == 0)
            DFS(G, p->adjvex);
        p = p->nextarc;
    }
}

void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e)  //创建图的邻接表
{
    ArcNode *p;
    G = (AdjGraph*)malloc(sizeof(AdjGraph));
    for (int i = 0; i < n; ++i)
        G->adjlist[i].firstarc = NULL;
    for (int i = 0; i < n; ++i)
        for (int j = n - 1; j >= 0; --j)
            if (A[i][j] != 0 && A[i][j] != INF)
            {
                p = (ArcNode *)malloc(sizeof(ArcNode));
                p->weight = A[i][j];
                p->adjvex = j;
                p->nextarc = G->adjlist[i].firstarc;
                G->adjlist[i].firstarc = p;
            }
    G->n = n;
    G->e = e;
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/isunbin/article/details/79953552