• 图的基本操作


     1 ADT Graph{
     2     数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
     3         数据关系R:R={VR}
     4     VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧,
     5         谓词P(v,w)定义了弧<v,w>的意义或信息}
     6     基本操作:
     7     CreateGraph( &G, V, VR )
     8     初始条件:V是图的顶点集,VR是图中弧的集合。
     9     操作结果:按V和VR的定义构造图G。
    10     DestroyGraph( &G )
    11     初始条件:图G存在。
    12     操作结果:销毁图G。
    13     LocateVex( G, u )
    14     初始条件:图G存在,u和G中顶点有相同特征。
    15     操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。
    16     GetVex( G, v )
    17     初始条件:图G存在,v是G中某个顶点。
    18     操作结果:返回v的值。
    19     PutVex( &G, v, value )
    20     初始条件:图G存在,v是G中某个顶点。
    21     操作结果:对v赋值value。
    22     FirstAdjVex( G, v )
    23     初始条件:图G存在,v是G中某个顶点。
    24     操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。
    25     NextAdjVex( G, v, w )
    26     初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。
    27     操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回“空”。
    28     InsertVex( &G, v )
    29     初始条件:图G存在,v和图中顶点有相同特征。
    30     操作结果:在图G中增添新顶点v。
    31     DeleteVex( &G, v )
    32     初始条件:图G存在,v是G中某个顶点。
    33     操作结果:删除G中顶点v及其相关的弧。
    34     InsertArc( &G, v, w )
    35     初始条件:图G存在,v和w是G中两个顶点。
    36     操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧<v,w>37     DeleteArc( &G, v, w )
    38     初始条件:图G存在,v和w是G中两个顶点。
    39     操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧<v,w>40     DFSTraverse( G, Visit() )
    41     初始条件:图G存在,Visit是顶点的应用函数。
    42     操作结果:对图进行深度优先遍历。在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
    43     BFSTraverse( G, Visit() )
    44     初始条件:图G存在,Visit是顶点的应用函数。
    45     操作结果:对图进行广度优先遍历。在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
    46 }ADT Graph
    Status CreateGraph(MGraph &G)//输入顶点和弧的信息,建立图
    {
        printf("输入顶点数和弧数如:(5,3):");
        scanf("%d,%d", &G.vexnum, &G.arcnum);
        printf("输入%d个顶点(以空格隔开如:v1 v2 v3):", G.vexnum);
        getchar();//吃掉换行符
         int m;
        for(m = 0; m < G.vexnum; m++){
            scanf("%c", &G.vexs[m]);
            getchar();//吃掉空格符
        }
        for( m = 0; m < G.vexnum; m++){
            printf("%c", G.vexs[m]);
            printf("
    ");
            getchar();//吃掉空格符                         
        }
    //初始化并打印初始化的邻接矩阵
        int i=0, j=0;
        for(i = 0; i < G.vexnum; i++){
            for(j = 0; j < G.vexnum; j++){
                G.arcs[i][j] = 0;
                printf(    "%5d
    ",G.arcs[i][j]);
            }
        }
        
        VexType v1, v2;//分别是一条弧的弧尾和弧头(起点和终点)
        int w;//对于无权图或网,用0或1表示相邻否;对于带权图或网,则为相应权值    
        printf("
    每行输入一条弧依附的顶点(先弧尾后弧头)和权值(如:v1 v2 3):
    ");
        fflush(stdin);//清除残余后,后面再读入时不会出错
       for(int k = 0; k < G.arcnum; k++){
            scanf("%c %c %d",&v1, &v2, &w);
            fflush(stdin);//清除残余后,后面再读入时不会出错
            i = locateVex(G, v1);
            j = locateVex(G, v2);
            G.arcs[i][j] = w;
        }
    
        return OK;
        //-------------------------------------
    }
  • 相关阅读:
    【LeetCode】Validate Binary Search Tree ——合法二叉树
    协程(Coroutine)并不是真正的多线程(转)
    转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)
    转: eclipse 快捷键列表(功能清晰版本)
    电商初级技术方案探讨
    转: Vue.js——60分钟组件快速入门(上篇)
    音视频推荐书籍
    md5sum使用注意事项
    转: java DES的算法片码
    ant 命令学习详解
  • 原文地址:https://www.cnblogs.com/spsglz/p/7902553.html
Copyright © 2020-2023  润新知