• 图的封装(C++)


    一. 问题说明

        1.问题的简单描述

            将图和网的的创建和基本操作分封装到class

            用来熟悉此种数据结构和基于这种数据结构上的基本算法

           采用VS2010编译环境

         2.工作安排

      

    . 源代码

      1.文件stdafx.h

     

     1 #pragma once
     2 #include "targetver.h"
     3 #include <stdio.h>
     4 #include <tchar.h>
     5 #include<iostream>
     6 #include<string>
     7 #include<string.h>
     8 using namespace std;
     9 /*
    10     以下完成图的存储结构
    11     (
    12         关键在于结构体的组合
    13     )
    14 */
    15 #define INFINITY   INT_MAX // 用整形最大值代替∞
    16 const int MAX_VERTEX_NUM=26;// 最大顶点个数
    17 #define VRType  int  //顶点关系类型
    18 #define InfoType  string//弧相关信息
    19 #define VertexType string//顶点类型
    20 enum GraphKind{DG,DN,UDG,UDN};// 有向图,有向网,无向图,无向网
    21 typedef struct 
    22 {
    23     VRType  adj; //adjacency  邻接
    24                  // 对图来说1(是),0(否)表示相邻关系
    25                  // 对网来说为权值
    26     InfoType info;   //Info 信息
    27                       //该弧相关信息的指针
    28 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    29       //Arc  弧(边)
    30 struct MGraph
    31 {
    32     VertexType vex[MAX_VERTEX_NUM];   //顶点向量
    33     AdjMatrix arcs;   //邻接矩阵
    34     int vexnum,arcnum ;
    35     GraphKind kind;   //图的种类
    36 };
    37 class Graph
    38 {  
    39 private:
    40     MGraph G;
    41 public:
    42     Graph();
    43     void CreateUDG();//创建无向图
    44     void CreateUDN();//创建无向网
    45     void CreateDG(); //创建有向图
    46     void CreateDN(); //创建有向网
    47     void CreateUDG_BYFile();//创建无向图,通过文件
    48     void CreateUDN_BYFile();//创建无向网,通过文件
    49     void CreateDG_BYFile(); //创建有向图,通过文件
    50     void CreateDN_BYFile(); //创建有向网,通过文件
    51     int LocateVex(VertexType u); //以顶点名称确定其邻接矩阵中的位置
    52     void  Display();//展示图或网的顶点向量,和邻接矩阵
    53 };

       2.文件Graph_Matrix.cpp

        

      1 #include "stdafx.h"
      2 Graph::Graph()
      3 {   
      4     cout<<"请输入图G的类型( 有向图:0; 有向网:1; 无向图 :2; 无向网 3;)"<<endl;
      5     scanf("%d",&G.kind);
      6     switch(G.kind)
      7     {
      8         case UDG: CreateUDG();
      9                   break;
     10         case UDN: CreateUDN();
     11                   break;
     12         case DG: CreateDG();
     13                   break;
     14         case DN: CreateDN();
     15                   break;
     16     }
     17 }
     18 void Graph::CreateUDG()
     19 {
     20     /*采用数组(邻接矩阵)表示法,构造无向图G
     21       以边为输入单位,即输入边的俩个顶点
     22       关键在于判断输入顶点是否存在,返回其位置
     23     */
     24     int i,j,IncInfo;//是否包含边或弧的相关信息
     25     VertexType  va,vb;
     26     cout<<"请输入无向图的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
     27     cin>>G.vexnum;//顶点数
     28     cin>>G.arcnum;//边数
     29     cin>>IncInfo;//是否具有相关信息的判断条件
     30     cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
     31     for(i=0; i<G.vexnum; i++)//构造顶点向量
     32     {
     33         cin>>G.vex[i];
     34     }
     35     for(i=0; i<G.vexnum; i++)//初始化邻接矩阵
     36     {
     37         for(j=0; j<G.vexnum; j++)
     38         {
     39             G.arcs[i][j].adj=0;//
     40             G.arcs[i][j].info="NULL";//初始化为空串
     41         }
     42     }
     43     cout<<"请输入"<<G.arcnum<<"条边的顶点1,顶点2:"<<endl;
     44     for(int k=0; k<G.arcnum; k++)//按边录入信息
     45     {
     46         cin>>va;
     47         i=LocateVex(va);//查询下标,va所在的行坐标
     48         cin>>vb;
     49         j=LocateVex(vb);//查询下标,vb所在的行坐标
     50         G.arcs[i][j].adj=1;  //表示va 与 vb 相连  无向图
     51         G.arcs[j][i].adj=1;  //表示va与vb相连     无向图
     52         if(IncInfo)
     53         {
     54             cout<<"请输入该边相关信息"<<endl;
     55             cin>>G.arcs[i][j].info;  //输入字符串
     56             G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
     57         }
     58     }
     59     G.kind=UDG;  //创建成功
     60 }
     61 void Graph::CreateUDN()
     62 {
     63     /*
     64         原理和UDG相同,只是增加了权值的输入
     65     */
     66     int i,j,IncInfo;//是否包含边或弧的相关信息
     67     VertexType  va,vb;
     68     cout<<"请输入无向网的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
     69     cin>>G.vexnum;//顶点数
     70     cin>>G.arcnum;//边数
     71     cin>>IncInfo;//是否具有相关信息的判断条件
     72     cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
     73     for(i=0; i<G.vexnum; i++)//构造顶点向量
     74     {
     75         cin>>G.vex[i];
     76     }
     77     for(i=0; i<G.vexnum; i++)//初始化邻接矩阵
     78     {
     79         for(j=0; j<G.vexnum; j++)
     80         {
     81             G.arcs[i][j].adj=INFINITY;//网,无穷大表示不连接
     82             G.arcs[i][j].info="NULL";//初始化为空串
     83         }
     84     }
     85     for(int k=0; k<G.arcnum; k++)//按边录入信息
     86     {
     87         cout<<"请输入第"<<k+1<<"条边的顶点1,顶点2:"<<endl;
     88         cin>>va;
     89         i=LocateVex(va);//查询下标,va所在的行坐标
     90         cin>>vb;
     91         j=LocateVex(vb);//查询下标,vb所在的行坐标
     92         cout<<"请输入权值"<<endl;
     93         cin>>G.arcs[i][j].adj;
     94         G.arcs[j][i].adj=G.arcs[i][j].adj;
     95         if(IncInfo)
     96         {
     97             cout<<"请输入该边相关信息"<<endl;
     98             cin>>G.arcs[i][j].info;  //输入字符串
     99             G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
    100         }
    101     }
    102     G.kind=UDN;  //创建成功
    103 }
    104 void Graph::CreateDG()
    105 {
    106     /*
    107         原理与UDG相同,邻接矩阵略有区别
    108     */
    109     int i,j,IncInfo;//是否包含边或弧的相关信息
    110     VertexType  va,vb;
    111     cout<<"请输入有向图的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
    112     cin>>G.vexnum;//顶点数
    113     cin>>G.arcnum;//边数
    114     cin>>IncInfo;//是否具有相关信息的判断条件
    115     cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
    116     for(i=0; i<G.vexnum; i++)//构造顶点向量
    117     {
    118         cin>>G.vex[i];
    119     }
    120     for(i=0; i<G.vexnum; i++)//初始化邻接矩阵
    121     {
    122         for(j=0; j<G.vexnum; j++)
    123         {
    124             G.arcs[i][j].adj=0;//
    125             G.arcs[i][j].info="NULL";//初始化为空串
    126         }
    127     }
    128     cout<<"请输入"<<G.arcnum<<"条弧的弧头,弧尾:"<<endl;
    129     for(int k=0; k<G.arcnum; k++)//按边录入信息
    130     {
    131         cin>>va;
    132         i=LocateVex(va);//查询下标,va所在的行坐标
    133         cin>>vb;
    134         j=LocateVex(vb);//查询下标,vb所在的行坐标
    135         G.arcs[j][i].adj=1;  //表示vb(弧尾) 与 vb(弧头) 相连,也就是说vb可以到达va,反之不一定  有向图 vb——>va
    136         if(IncInfo)
    137         {
    138             cout<<"请输入该弧相关信息"<<endl;
    139             cin>>G.arcs[i][j].info;  //输入字符串
    140             G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
    141         }
    142     }
    143     G.kind=DG; //创建成功
    144 }
    145 void Graph::CreateDN()
    146 {
    147     /*
    148         原理和DG相同,只是增加了权值的输入
    149     */
    150     int i,j,IncInfo;//是否包含边或弧的相关信息
    151     VertexType  va,vb;
    152     cout<<"请输入有向网的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
    153     cin>>G.vexnum;//顶点数
    154     cin>>G.arcnum;//边数
    155     cin>>IncInfo;//是否具有相关信息的判断条件
    156     cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
    157     for(i=0; i<G.vexnum; i++)//构造顶点向量
    158     {
    159         cin>>G.vex[i];
    160     }
    161     for(i=0; i<G.vexnum; i++)//初始化邻接矩阵
    162     {
    163         for(j=0; j<G.vexnum; j++)
    164         {
    165             G.arcs[i][j].adj=INFINITY;//网,无穷大表示不连接
    166             G.arcs[i][j].info="NULL";//初始化为空串
    167         }
    168     }
    169     for(int k=0; k<G.arcnum; k++)//按边录入信息
    170     {
    171         cout<<"请输入第"<<k+1<<"条弧的弧头,弧尾:"<<endl;
    172         cin>>va;
    173         i=LocateVex(va);//查询下标,va所在的行坐标
    174         cin>>vb;
    175         j=LocateVex(vb);//查询下标,vb所在的行坐标
    176         cout<<"请输入权值"<<endl;
    177         cin>>G.arcs[j][i].adj;
    178         if(IncInfo)
    179         {
    180             cout<<"请输入该弧相关信息"<<endl;
    181             cin>>G.arcs[i][j].info;  //输入字符串
    182             G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
    183         }
    184     }
    185     G.kind=DN;  //创建成功
    186 }
    187 int  Graph::LocateVex(VertexType u)//给定顶点值,返回顶点在顶点数组中的下标,方便按边录入信息
    188 {
    189     for(int i=0; i<G.vexnum; i++)
    190     {
    191         if(G.vex[i]==u)
    192         {
    193             return i;
    194         }
    195     }
    196     return -1;
    197 }
    198 void Graph::Display()
    199 {
    200     cout<<"顶点向量"<<endl;
    201     for(int i=0; i<G.vexnum; i++)
    202     {
    203         cout<<"顶点"<<G.vex[i]<<endl;
    204     }
    205     cout<<"邻接矩阵"<<endl;
    206     for(int i=0; i<G.vexnum; i++)
    207     {
    208         for(int j=0;j<G.vexnum;j++)
    209         {
    210             cout<<G.arcs[i][j].adj<<"	";
    211         }
    212         cout<<endl;
    213     }
    214     cout<<"顶点1  顶点2    信息"<<endl;
    215     if(G.kind>1) //对于无向图或者无向网来说,邻接矩阵是对称的
    216     {
    217         for(int i=0; i<G.vexnum; i++)
    218         {
    219             for(int j=0;j<i;j++)
    220             {
    221                 if(G.arcs[i][j].adj!=0&&G.arcs[i][j].adj!=INFINITY)
    222                 {
    223                     cout<<G.vex[i]<<"	";
    224                     cout<<G.vex[j]<<"	";
    225                     cout<<G.arcs[i][j].info<<endl;
    226                 }
    227             }
    228         }
    229     }
    230     else//对于有向图或者有向网来说,邻接矩阵必须要全部输出
    231     {
    232         for(int i=0; i<G.vexnum; i++)
    233         {
    234             for(int j=0;j<G.vexnum;j++)
    235             {
    236                 if(G.arcs[i][j].adj!=0&&G.arcs[i][j].adj!=INFINITY)
    237                 {
    238                     cout<<G.vex[i]<<"	";
    239                     cout<<G.vex[j]<<"	";
    240                     cout<<G.arcs[i][j].info<<endl;
    241                 }
    242             }
    243         }
    244     }
    245 }
    246 int _tmain(int argc, _TCHAR* argv[])
    247 {   
    248     Graph g;
    249     g.Display();
    250     return 0;
    251 }

          

  • 相关阅读:
    Java的格式化输出
    常用排序算法的Python实现
    零基础自学用Python 3开发网络爬虫(一)
    Python常见数据结构整理
    百度天气预报API的使用(java版本)
    大总结
    CCS学习(三)
    CSS学习(页外引用还不懂)
    CSS自定义动画
    ssm日期格式转换
  • 原文地址:https://www.cnblogs.com/Howbin/p/8994317.html
Copyright © 2020-2023  润新知