DFS(邻接表表示)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

#define PATH
#define VERTEX_NUM 8

#ifdef PATH
int count = 1;
#endif
bool visited[VERTEX_NUM + 1];            // 访问标志数组(备忘表)

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

int FirstAdjVex(ArcNode *G[VERTEX_NUM + 1], int v)
{
    if (G[v] == NULL)                    // v是孤立顶点
        return -1;
    return G[v]->adjvex;
}

int NextAdjVex(ArcNode *G[VERTEX_NUM + 1], int v, int w)
{
    for (ArcNode *p = G[v]; p != NULL; p = p->nextarc) {
        if (p->adjvex == w) {            // 找到w,将返回
            if (p->nextarc == NULL)        // w已是v的最后一个邻接点
                return -1;
            return p->nextarc->adjvex;
        }
    }
    cout << "错误!没找到w" << endl;
    return -1;
}


void DFS(ArcNode *G[VERTEX_NUM + 1], int v)
{
    // 从第v个顶点出发递归地深度优先遍历图G。
    int w;
    visited[v] = true;
    cout << v << endl;
    for (w = FirstAdjVex(G, v);  w != -1;  w = NextAdjVex(G, v, w)) {
#ifdef PATH
        cout << "------------------" << count++ << "----" << v << "->" << w << endl;    // 1
#endif
        if (!visited[w]) {        // 对v的尚未访问的邻接顶点w递归调用DFS
            DFS(G, w);
#ifdef PATH
            cout << v << endl;    // 有待研究?                                            // 2
#endif
        }
    }
#ifdef PATH
    cout << "回溯路径" << v << "->";                                                    // 3
#endif
}

void DFSTraverse(ArcNode *G[VERTEX_NUM + 1])
{
    // 对图G作深度优先遍历。
    int v;
    for (v = 1; v <= VERTEX_NUM; ++v)
        visited[v] = false;                    // 访问标志数组初始化
    for (v = 1; v <= VERTEX_NUM; ++v) {        // 若是连通图,则v=1即全遍历到
        if (!visited[v])
            DFS(G, v);                        // 对尚未访问的顶点调用DFS
    }
    cout << endl;
}

void CreatAdjListGraph(ArcNode *G[VERTEX_NUM + 1])
{
    int a;
    int b;
    while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
        ArcNode *p = new ArcNode;
        if (p == NULL) {
            cout << "OVERFLOW!" << endl;
            exit(OVERFLOW);
        }
        p->adjvex = b;
        p->nextarc = G[a];    // 头插入
        G[a] = p;

        ArcNode *q = new ArcNode;
        if (q == NULL) {
            cout << "OVERFLOW!" << endl;
            exit(OVERFLOW);
        }
        q->adjvex = a;
        q->nextarc = G[b];    // 头插入
        G[b] = q;
    }
}

void Display(ArcNode *G[VERTEX_NUM + 1])
{
    for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接表
        cout << i;
        for (ArcNode *p = G[i]; p != NULL; p = p->nextarc) {
            cout << "->" << p->adjvex ;
        }
        cout << endl;
    }
}

void Free(ArcNode *G[VERTEX_NUM + 1])
{
    for (int i = 1; i <= VERTEX_NUM; i++) {
        for (ArcNode *p = G[i]; p != NULL;) {
            ArcNode *q = p;
            p = p->nextarc;
            delete q;
            q = NULL;
        }
    }
}

int main(int argc, char **argv)
{
    freopen("cin.txt", "r", stdin);
    ArcNode *G[VERTEX_NUM + 1] = {NULL};

    CreatAdjListGraph(G);    // 建图(邻接表表示)

    Display(G);                // 显示图

    DFSTraverse(G);            // 遍历图

    Free(G);                // 释放图

    return 0;
}

/* cin.txt:
1 2
2 4
2 5
8 4
8 5
1 3
3 6
3 7
6 7
0 0
*/

 

原文地址:https://www.cnblogs.com/jjtx/p/2550106.html