数据结构--图的遍历(深度优先遍历)

数据结构–图的遍历(深度优先遍历)

深度优先遍历是从图中某个顶点出发,访问此顶点,然后从它未被访问到的邻接点出发深度优先遍历图,直到图中所有和它有路径相通的顶点都被访问到.

邻接矩阵:

#include <stdio.h>

#define MAXVEX 20 //最大顶点数 
#define FINITY 100 //代表 ∞ 
typedef char VertexType;    //顶点类型
int visit[MAXVEX];          ////标志数组

//邻接矩阵存储结构
typedef struct{
    VertexType vexs[MAXVEX];    //顶点数组 
    int arc[MAXVEX][MAXVEX];    //边的权值 
    int numVertexes,numEdges;   //实际顶点数和边数 
}MGraph;

//创建邻接矩阵
void Create(MGraph *G){

    int i,j;

    printf("输入顶点数和边数:\n");
    scanf("%d%d",&G->numVertexes,&G->numEdges);

    //输入顶点信息,创建顶点表 
    printf("输入顶点信息:\n");
    for(i=0;i<G->numVertexes;i++){
        getchar();
        scanf("%c",&G->vexs[i]);
    }

    //输入邻接矩阵
    printf("输入邻接矩阵:\n");
    for(i=0;i<G->numVertexes;i++){
        for(j=0;j<G->numVertexes;j++){
            scanf("%d",&G->arc[i][j]);
            if(G->arc[i][j]==0)
                G->arc[i][j]=FINITY;
        }
    } 

    //输出邻接矩阵
    printf("邻接矩阵为:\n");
    for(i=0;i<G->numVertexes;i++){
        for(j=0;j<G->numVertexes;j++)
            printf("%3d ",G->arc[i][j]);
        printf("\n");
    } 
} 

//邻接矩阵的深度遍历操作 
void DFSTraverse(MGraph G){
    int i;

    for(i=0;i<G.numVertexes;i++)
        visit[i]=0; 
    for(i=0;i<G.numVertexes;i++)
        if(visit[i]==0)
            DFS(G,i);   
}

//邻接矩阵的深度优先递归算法
void DFS(MGraph G,int i){
    int j;
    visit[i]=1;
    printf("%c ",G.vexs[i]);
    for(j=0;j<G.numVertexes;j++)
        if(G.arc[i][j]!=FINITY&&visit[j]==0)
            DFS(G,j);
} 

int main(){

    MGraph  G;

    Create(&G);
    DFSTraverse(G);
}

运行结果:
《数据结构--图的遍历(深度优先遍历)》

邻接表:

#include <stdio.h>
#include <stdlib.h>

#define MAXVEX 20
typedef char VertexType;
int visit[MAXVEX];

//边表结点 
typedef struct EdgeNode{
    int adjvex;
    struct EdgeNode *next;
}EdgeNode;

//顶点表结点
typedef struct VertexNode{
    VertexType data;
    EdgeNode *firstedge;
}VertexNode,AdjList[MAXVEX];

typedef struct{
    AdjList adjlist;
    int numVertexes,numEdges;
}GraphAdjList;

//创建邻接表
void Create(GraphAdjList *G){

    int i,j,k;
    EdgeNode *p;

    printf("输入顶点数和边数:\n");
    scanf("%d%d",&G->numVertexes,&G->numEdges);

    //输入顶点信息
    printf("输入顶点信息:\n");
    for(i=0;i<G->numVertexes;i++){
        getchar();
        scanf("%c",&G->adjlist[i].data);
        G->adjlist[i].firstedge=NULL;           //将指向边表的指针初始化 
    } 

    //建立边表
    printf("输入边(Vi,Vj)中的下标i,j:\n"); 
    for(k=0;k<G->numEdges;k++){
        scanf("%d%d",&i,&j);
        p=(EdgeNode *)malloc(sizeof(EdgeNode));
        p->adjvex=j;                                //存储弧头 
        p->next=G->adjlist[i].firstedge;            //头插法插入边结点 
        G->adjlist[i].firstedge=p;

        //下面代码有向图无,无向图有 
        p=(EdgeNode *)malloc(sizeof(EdgeNode));
        p->adjvex=i;                                //存储弧头 
        p->next=G->adjlist[j].firstedge;            //头插法插入边结点 
        G->adjlist[j].firstedge=p;
    }

    //打印邻接表
    printf("邻接表为:\n");
    for(i=0;i<G->numVertexes;i++){
        p=G->adjlist[i].firstedge;
        while(p){
            printf("(%c,%c)",G->adjlist[i].data,G->adjlist[p->adjvex].data);
            p=p->next;
        }
        printf("\n");
    } 
} 

//邻接表深度遍历操作
void DFSTraverse(GraphAdjList G){
    int i;
    for(i=0;i<G.numVertexes;i++)
        visit[i]=0;
    for(i=0;i<G.numVertexes;i++)
        if(visit[i]==0)
            DFS(G,i);
} 

//邻接表深度优先递归算法
void DFS(GraphAdjList G,int i){
    EdgeNode *p;
    visit[i]=1;
    printf("%c ",G.adjlist[i].data);
    p=G.adjlist[i].firstedge;
    while(p){
        if(visit[p->adjvex]==0)
            DFS(G,p->adjvex);
        p=p->next;
    }
} 

int main(){

    GraphAdjList G;

    Create(&G);
    DFSTraverse(G);
}

运行结果:
《数据结构--图的遍历(深度优先遍历)》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/ledou2/article/details/81905831
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞