数据结构之邻接矩阵和邻接表的建立及dfs和bfs的遍历

邻接矩阵版:

#include <bits/stdc++.h>
using namespace std;
const int MaxSize = 10;
template <class DataType>
class Mgraph {
public:
    Mgraph(DataType a[], int n, int e);
    ~Mgraph() {};
    void DFS(int v) {
        memset(vis, 0, sizeof(vis));//vis用来标记一个顶点是否已经遍历过
        //vis[i]=1表示已经遍历过了
        DFSTraverse(v);
    };
    void BFS(int v) {
        memset(vis, 0, sizeof(vis));
        BFSTraverse(v);
    };

    void T() {//用来输出邻接矩阵
        for(int i = 0; i < vertexNum; i++) {
            for(int j = 0; j < vertexNum; j++) {
                cout << "[" << arc[i][j] << "] ";
            }
            cout << endl;
        }
    };

private:
    void DFSTraverse(int v);
    void BFSTraverse(int v);
    int vertexNum, arcNum;//顶点数和边数
    int vis[MaxSize];
    DataType vertex[MaxSize];//顶点信息
    int arc[MaxSize][MaxSize];//邻接矩阵,arc[i][j]=1,表示i顶点和j顶点之间有边相连
    int Q[MaxSize];//队列数组,用在BFS中
};
template <class DataType>
Mgraph<DataType>:: Mgraph(DataType a[], int n, int e) {//构造函数
    vertexNum = n;
    arcNum = e;
    memset(vis, 0, sizeof(vis));
    for(int i = 0; i < vertexNum; i++) {
        vertex[i] = a[i];
    }
    for(int i = 0; i < vertexNum; i++) {
        for(int j = 0; j < vertexNum; j++) {
            arc[i][j] = 0;
        }
    }
    int i, j;
    for(int k = 0; k < arcNum; k++) {
        cin >> i >> j;
        arc[i][j] = 1;
        arc[j][i] = 1;
    }
}
template <class DataType>
void Mgraph<DataType>:: DFSTraverse(int v) {
    cout << vertex[v] << " " ;
    vis[v] = 1;
    for(int i = 0; i < vertexNum; i++) {
        if(!vis[i] && arc[i][v]) DFSTraverse(i);
    }
}
template <class DataType>
void Mgraph<DataType>:: BFSTraverse(int v) {
    int Front, Rear;
    vis[v] = 1;
    Front = Rear = -1;
    cout << vertex[v] << " ";
    Q[++Rear] = v;
    while(Front != Rear) {
        v = Q[++Front];
        for(int i = 0; i < vertexNum; i++) {
            if(!vis[i] && arc[i][v]) {
                cout << vertex[i] << " ";
                vis[i] = 1;
                Q[++Rear] = i;
            }
        }
    }
}
int main() {
    int a[5] = {0, 1, 2, 3, 4};
    Mgraph<int> G(a, 5, 4);
//    G.T();
    G.DFS(0);
    cout << endl;
    G.BFS(0);
    return 0;
}
/*
0 1
1 2
2 3
3 4

*/

邻接表版:

#include <bits/stdc++.h>
using namespace std;
struct ArcNode { //边表节点
    int adjvex;
    ArcNode *next;
};
template<class DataType>//顶点表
struct VertexNode {
    DataType vertex;
    ArcNode *firstedge;
};
const int MaxSize = 10;
template<class DataType>
class ALGraph {
public:
    ALGraph(DataType a[], int n, int e);
    ~ALGraph() ;
    void DFS(int v) {
        memset(vis, 0, sizeof(vis));
        DFSTraverse(v);
    };
    void BFS(int v) {
        memset(vis, 0, sizeof(vis));
        BFSTraverse(v);
    };
private:
    void DFSTraverse(int v);
    void BFSTraverse(int v);
    VertexNode<DataType> adjlist[MaxSize];
    int vertexNum, arcNum;
    int vis[MaxSize];
};
template<class DataType>
ALGraph<DataType>::ALGraph(DataType a[], int n, int e) {
    vertexNum = n;
    arcNum = e;
    for(int i = 0; i < vertexNum; i++) {
        adjlist[i].vertex = a[i];
        adjlist[i].firstedge = NULL;
    }
    for(int k = 0; k < arcNum; k++) {//无向图
        int i, j;
        cin >> i >> j;
        ArcNode *s = new ArcNode;
        s->adjvex = j;
        s->next = adjlist[i].firstedge;
        adjlist[i].firstedge = s;
        ArcNode *p = new ArcNode;
        p->adjvex = i;
        p->next = adjlist[j].firstedge;
        adjlist[j].firstedge = p;
    }
}
template <class DataType>
ALGraph<DataType>::~ALGraph() {//回收内存
    for(int i = 0; i < vertexNum; i++) {
        while(adjlist[i].firstedge != NULL) {
            ArcNode *p = adjlist[i].firstedge;
            adjlist[i].firstedge = p->next;
            delete p;
            p = NULL;
        }
    }
}
template <class DataType>
void ALGraph<DataType>::  DFSTraverse(int v) {
    cout << adjlist[v].vertex << " ";
    vis[v] = 1;
    ArcNode *p = adjlist[v].firstedge;
    while(p != NULL) {
        if(!vis[p->adjvex]) DFSTraverse(p->adjvex);
        p = p->next;
    }
}
template <class DataType>
void ALGraph<DataType>::  BFSTraverse(int v) {
    int Queue[MaxSize];
    int Front = -1;
    int Rear = -1;
    cout << adjlist[v].vertex << " ";
    vis[v] = 1;
    Queue[++Rear] = v;
    while(Front != Rear) {
        v = Queue[++Front];
        ArcNode*p = adjlist[v].firstedge;
        while(p != NULL) {
            if(!vis[p->adjvex]) {
                cout << adjlist[p->adjvex].vertex << " ";
                Queue[++Rear] = p->adjvex;
                vis[p->adjvex] = 1;
            }
            p = p->next;
        }
    }
}
int main() {
//    int n,m;
//    int a[100];
//    cout<<"请输入顶点和边的的信息"<<endl;
//     cin>>n>>m;
//   cout<<"请输入顶点信息:"<<endl;
//    for(int i=0;i<n;i++) cin>>a[i];
//    cout<<"请输入边的信息:"<<endl;
int  a[5]={0,1,2,3,4};
    ALGraph<int>G(a, 5, 4);
    G.DFS(1);
    cout << endl;
    G.BFS(1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80525805