数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

    图有四种存储结构:数组,邻接表,十字链表,邻接多重表。下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历。其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含。具体代码如下:

//图的数组(邻接矩阵)存储表示和深度优先遍历

const int MAX_VERTEX_NUM=20;  //最大顶点数
typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网)
typedef int VRType;
typedef char InfoType;
typedef char VertexType;

typedef struct ArcCell{
    VRType adj;  //VRType是顶点关系类型,对于无权图,用1或者0表示顶点相邻与否,对于有权图,则为权值类型
    InfoType  info;//该弧相关信息指针
    ArcCell(){
        adj=0;
        info=0;
    }
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct MGraph{
    VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
    AdjMatrix arcs;  //邻接矩阵
    int vexnum,arcnum;  //图当前的顶点数和弧数
    GraphKind kind;  //图的种类标志
}MGraph;

int LocateVex(MGraph G,char v1){
    for(int i=0;i>vexnumber>>arcnumber>>info;
    G.vexnum=vexnumber;
    G.arcnum=arcnumber;
    for(int i=0;i>G.vexs[i];
    }
    for(int i=0;i>v1>>v2>>weight;
        i=LocateVex(G,v1);  j=LocateVex(G,v2);
        G.arcs[i][j].adj=weight;
        G.arcs[j][i].adj=weight;
        if(info!=48){//0的ascii码为48
            cout<<"please input infomation: ";
            cin>>infomation;
            G.arcs[i][j].info=infomation;
            G.arcs[j][i].info=infomation;
        }
    }
    return OK;
}

void DisMGraph(MGraph m){
    for(int i=0;i=0;w=NextAdjVex(G,v,w)){
        if(!visited[w]) DFS(G,w); //对v的尚未访问的邻接顶点W递归调用DFS
    }
}

void DFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){
    //对图做深度优先遍历
    for(int v=0;v que;
    char tempvex=0;
    for(int v=0;v=0;w=NextAdjVex(G,tempvex,w)){
                    if(!visited[w]){
                        visited[w]=true;
                        Visit(G,w);
                        que.push(G.vexs[w]);
                    }
                }
            }
        }
    }
}
int main()
{
    MGraph m;
    CreateUDN(m);
    DisMGraph(m);
    cout<<"DFS result:";
    DFSTraverse(m,VisitFunc);
    cout<

运行结果:

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历_第1张图片

你可能感兴趣的:(数据结构)