zoukankan      html  css  js  c++  java
  • 图的遍历

    #include<stdio.h>
    #include<limits.h>
    #include<stdlib.h>
    
    #define INFINITY INT_MAX 
    #define MAX_VERTEX_NUM 20 /*最多顶点个数*/
    #define Error -1
    #define OK 1
    
    /*=====================================邻接矩阵表示法的c语言描述=================================================*/
    
    typedef  enum{DG, DN,UDG,UDN}GraphKind;/*图的种类: DG表示有向图, DN表示有向网, UDG表示无向图, UDN表示无向网*/
    
    /*边的定义*/
    typedef int AdjType;          /*权值类型*/
    typedef struct {        
        AdjType adj;              /*对于无权图,用1或0表示是否相邻,对带权图,则为权值类型*/
        //OtherInfo info;         /*边存储的其它信息,因为此处无使用,故进行注释处理*/
    } ArcNode;
    
    /*图(邻接矩阵)的定义*/
    typedef char VertexData; 
    typedef  struct{
        GraphKind kind;                              /*图的种类标志*/
        int vexnum, arcnum;                          /*图的顶点数和弧数*/
        VertexData vertex[MAX_VERTEX_NUM];           /*顶点向量*/
        ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];/*邻接矩阵*/
    }AdjMatrix;       
    
    /*=====================================图(邻接矩阵表示法)的基本操作=================================================*/
    
    /*算法7-1中需调用的LocateVex函数*/
    int LocateVex(AdjMatrix *G, VertexData v)
    {
        int j=Error, k;
        for(k=0; k<G->vexnum; k++)
            if(G->vertex[k]==v)
            {
                j=k;
                break;
            }
        return j;
    }
    
    //算法7-1:输入n个顶点和e条边的信息,创建赋权有向图G的邻接矩阵
    void CreateDN(AdjMatrix *G)
    {
        int i, j, k;
        AdjType weight;
        VertexData v1, v2;
    
        printf("请输入图的顶点数目:");
        scanf("%d", &G->vexnum );
    
        printf("请输入弧的数目:");
        scanf("%d", &G->arcnum );
    
        /*初始化邻接矩阵*/
        for(i=0; i<G->vexnum; i++)
            for(j=0; j<G->vexnum; j++)
                G->arcs[i][j].adj=INFINITY;
            
        printf("请输入顶点信息(直接连续输入,不要使用空格或回车间隔,除非空格或回车是顶点存储的元素):");
        fflush(stdin);    /*消除前面回车的影响*/
        for(i=0; i<G->vexnum; i++)
            scanf("%c", &G->vertex[i]);
    
        printf("构建邻接矩阵,请输入一条弧的起点、终点与权值,例如"a,b,10"
    ");
        for(k=0; k<G->arcnum; k++)
        {
            printf("第%d-%d条:", G->arcnum, k+1);
            fflush(stdin);
            scanf("%c,%c,%d", &v1, &v2, &weight);
            i=LocateVex(G, v1);
            j=LocateVex(G, v2);
            G->arcs[i][j].adj=weight;
            G->arcs[j][i].adj = weight;
        }
    }
    
    
    void main()
    {
        AdjMatrix G;
        G.kind=DN;
        CreateDN(&G); /*创建赋权有向图*/
    
        int i, j;
        printf("输出图的顶点:
    ");
        for(i=0; i<G.vexnum; i++)
            printf("%c", G.vertex[i]);
        printf("
    ");
    
        printf("输出图的邻接矩阵:
    ");
        for(i=0; i<G.vexnum; i++)
        {    for(j=0; j<G.vexnum; j++)
                printf("%14d", G.arcs[i][j].adj);
            printf("
    ");
        }
    }
  • 相关阅读:
    微软面试问题 情商测试
    SQL游标使用实例
    如何减小与“大牛”的差距
    Dotnet面试题
    排序算法对冒泡排序的优化改进算法
    一个SQL实现薪水大于所在部门平均薪水的员工
    ASP.NET中TextBox设置为Readonly后无法取值的解决办法
    jQuery.Autocomplete实现自动完成功能(详解)
    php发送get、post请求的几种方法
    ISO Latin1字符集
  • 原文地址:https://www.cnblogs.com/szq1214869/p/13073619.html
Copyright © 2011-2022 走看看