• C语言实现邻接矩阵创建无向图&图的深度优先遍历


    Code

    /* '邻接矩阵' 实现无向图的创建、深度优先遍历*/
    #include <stdio.h>
    #include <stdlib.h> 
    
    #define MaxVex      100          //最多顶点个数
    #define INFINITY    32768        //表示极大值,即 ∞
    #define TRUE        1
    #define FALSE       0
    #define OK          1
    #define ERROR       0
    
    typedef char VertexType;    //假设顶点数据类型为字符类型
    typedef int  EdgeType;      //对于无权图,用1或0表示是否相邻,对带权图,则为权值类型 
    typedef struct
    {
        VertexType vertex[MaxVex];            //顶点数组
        EdgeType arcs[MaxVex][MaxVex];       //邻接矩阵
        int    vexnum,arcnum;                //图中的顶点数和边数 
    }Graph;
    
    int visited[MaxVex];    //访问标志数组    
    
    /**********************各个子函数的定义*********************/
    void init(Graph *G);                    //初始化邻接矩阵 
    int LocateVertex(Graph *G,VertexType v);//求顶点位置函数
    int createUDG(Graph *G);                //创建一个无向图 
    void DepthFirstSearch(Graph G, int i);  //图的深度优先遍历
    void TraverseGraph(Graph G);
    
    /**************************主函数*************************/
    int main()
    {
        Graph G;
        int choice;
        while(true)
        {
             printf("*****************Please enter your choice*****************
    
    ");
            printf("                choice 1:Initialization
    ");
            printf("                choice 2:Create Graph
    ");
                    printf("                choice 3:Depth First Search
    ");       
            printf("                choice 0:exit
    
    ");
             scanf("%d",&choice);
            switch(choice)
            {
                case 1:
                    init(&G);
                    break;
                case 2:
                    (createUDG(&G)==1)?printf("Create Graph success.
    "):printf("Create Graph ERROR
    ");
                    break;
                case 3:
                    printf("图的深度优先遍历为: ");
                    TraverseGraph(G);
                    break;        
                case 0:
                    exit(0);
                    break;
                default:
                    printf("ERROR!!
    ");
                    exit(0);
                    break;
            }
        }
        return 0;
    } 
    
    /**********************各个子函数功能的实现*********************/
    void init(Graph *G)   //初始化邻接矩阵 
    {
        int i,j;
        printf("请输入图的顶点个数和边数:"); 
        scanf("%d %d",&(G->vexnum),&(G->arcnum));//输入图的顶点个数和边数 
        for(i=0;i<G->vexnum;i++)              //初始化
        {
            for(j=0;j<G->vexnum;j++)
            {
                G->arcs[i][j]=INFINITY;
            }
        } 
        printf("图的初始化成功
    "); 
    }
    
    int LocateVertex(Graph *G,VertexType v)  //查找并返回顶点的位置 
    {
        int j=0,k;
        for(k=0;k<G->vexnum;k++)
        {
            if(G->vertex[k]==v)
            {
                j=k;
                break;
            }
        }
        return j;    
    }
    
    int createUDG(Graph *G)  //创建一个无向图
    {
        int i,j,k,weight;
        VertexType v1,v2;
        for(i=0;i<G->vexnum;i++)
        {
            printf("请输入图的第 %d 顶点:",i+1);
            getchar();
            scanf("%c",&(G->vertex[i]));     //输入图的顶点集 
        } 
        for(k=0;k<G->arcnum;k++)
        {
            printf("请分别输入图的第 %d 条边的两个顶点和权值",k+1);
            getchar();
            scanf("%c %c %d",&v1,&v2,&weight);//输入一条边的两个顶点、权值 
            i=LocateVertex(G,v1);
            j=LocateVertex(G,v2);
            G->arcs[i][j]=weight;     //建立顶点之间的关系 
            G->arcs[j][i]=weight;
        } 
        return OK;
    }
    
    void DepthFirstSearch(Graph G, int i)   //图的深度优先遍历
    {
        int j;
        visited[i] = TRUE;
        printf("%c ",G.vertex[i]);  
        for (j=0; j<G.vexnum; j++)
        {
            if (G.arcs[i][j]!=INFINITY  &&  !visited[j])
                DepthFirstSearch(G,j);
        }
    }
    
    void TraverseGraph(Graph G)
    {
        int i;
        for (i=0; i<G.vexnum; i++)   //初始化访问标志数组
            visited[i] = FALSE;
    
        for (i=0; i<G.vexnum; i++)//循环调用深度优先遍历连通子图的操作,若图G是连通图,则此调用只执行一次 
        {
            if (!visited[i])
                DepthFirstSearch(G, i);
        }
        printf("
    ");
    }

    代码测试

  • 相关阅读:
    supervisor(一)基础篇
    linux添加开机自启动脚本示例详解
    suse 不能远程登录
    LintCode,hihoCoder,LeetCode有什么区别?
    windows 下安装nodejs 要怎么设置环境变量
    Java 集合:HashSet 与 ArrayList
    Java ArrayList、Vector和LinkedList等的差别与用法(转)
    一行代码实现java list去重
    25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
    Chart: Who pays the most in Seattle for software engineers
  • 原文地址:https://www.cnblogs.com/qftm/p/10317151.html
Copyright © 2020-2023  润新知