邻接矩阵实现图的深度优先搜索(2)

/*树的邻接矩阵的存储结构*/

#include <stdio.h>

#include <stdlib.h>

#define MAXVEX      10

#define InitEdge    0

typedef char VertexType;

typedef int EdgeType;

typedef struct MGraph

{

    VertexType vex[MAXVEX];

    EdgeType arc[MAXVEX][MAXVEX];

    int numVertexes;

    int numEdges;

}MGraph;

static int Flag[MAXVEX];

void CreateMGraph(MGraph *G)

{

    int i = 0,j = 0,k = 0,w = 0,m = 0,n = 0;

    char c;

    printf("请输入顶点数和边数,之间用逗号隔开 :\n");

    fflush(stdin);

    scanf("%d,%d",&(G->numVertexes),&(G->numEdges));

    printf("请输入顶点的值 :\n");

    fflush(stdin);

    scanf("%c",&c);

    while(i < G->numVertexes)

    {

        if(c == '\n')

            break;

        G->vex[i++] = c;

        scanf("%c",&c);

    }

    //邻接矩阵的初始化

    for(i = 0;i < G->numVertexes;i++)                                   //邻接矩阵的初始化,初始化为0

    {

        for(j = 0;j < G->numVertexes;j++)

        {

            G->arc[i][j] = InitEdge;

        }

    }

    for(i = 0;i < G->numVertexes;i++)                                   //标识数组的初始化,0表示未访问过

    {

        Flag[i] = 0;

    }

    fflush(stdin);

    for(m = 0,n = 0,k = 0; k < G->numEdges; k++)

    {

        printf("请输入边(Vi~Vj)的顶点下标i和j,以及权重w:\n");

        scanf("%d,%d,%d",&m,&n,&w);

        G->arc[m][n] = w;

        G->arc[n][m] = G->arc[m][n];

    }

    printf("\n\n结点中存放的数据为 :\n");

    for(i = 0;i < G->numVertexes;i++)

    {

        printf("%c ",G->vex[i]);

    }

    printf("\n\n您输入的邻接矩阵为:\n");

    for(i = 0;i < G->numVertexes;i++)                                 //输出邻接矩阵方便查看输入是否有误

    {

        for(j = 0;j < G->numVertexes;j++)

        {

            printf("%d ",G->arc[i][j]);

        }

        printf("\n");

    }

    printf("\n\n标示数组的值初始化为 :\n");

    for(i = 0;i < G->numVertexes;i++)

    {

        printf("%d ",Flag[i]);

    }



}

void DepthFirstSearch(MGraph *G,int i)

{

    int j = 0;

    if(Flag[i] == 0)

    {

        printf("%c ",G->vex[i]);

    }

    Flag[i] = 1;

    for(j = 0;j < G->numVertexes;j++)

    {

        if((G->arc[i][j]) != InitEdge && 0 == (Flag[j]))

        {

            DepthFirstSearch(G,j);

        }

    }



}



int main()

{

    int k = 0;                                      //设置从邻接矩阵的第几行开始DFS搜索,这里从第1行开始

    struct MGraph *G;

    CreateMGraph(G);

    printf("\n**********************************************\n");

    printf("DFS的排序结果为: \n");

    DepthFirstSearch(G,k);

    printf("\n**********************************************\n");

    return 0;

}

  

你可能感兴趣的:(搜索)