图的封装(C++)
一. 问题说明
1.问题的简单描述
将图和网的的创建和基本操作分封装到class
用来熟悉此种数据结构和基于这种数据结构上的基本算法
采用VS2010编译环境
2.工作安排

二. 源代码
1.文件stdafx.h
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
/*
以下完成图的存储结构
(
关键在于结构体的组合
)
*/
#define INFINITY INT_MAX // 用整形最大值代替∞
const int MAX_VERTEX_NUM=;// 最大顶点个数
#define VRType int //顶点关系类型
#define InfoType string//弧相关信息
#define VertexType string//顶点类型
enum GraphKind{DG,DN,UDG,UDN};// 有向图,有向网,无向图,无向网
typedef struct
{
VRType adj; //adjacency 邻接
// 对图来说1(是),0(否)表示相邻关系
// 对网来说为权值
InfoType info; //Info 信息
//该弧相关信息的指针
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//Arc 弧(边)
struct MGraph
{
VertexType vex[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum ;
GraphKind kind; //图的种类
};
class Graph
{
private:
MGraph G;
public:
Graph();
void CreateUDG();//创建无向图
void CreateUDN();//创建无向网
void CreateDG(); //创建有向图
void CreateDN(); //创建有向网
void CreateUDG_BYFile();//创建无向图,通过文件
void CreateUDN_BYFile();//创建无向网,通过文件
void CreateDG_BYFile(); //创建有向图,通过文件
void CreateDN_BYFile(); //创建有向网,通过文件
int LocateVex(VertexType u); //以顶点名称确定其邻接矩阵中的位置
void Display();//展示图或网的顶点向量,和邻接矩阵
};
2.文件Graph_Matrix.cpp
#include "stdafx.h"
Graph::Graph()
{
cout<<"请输入图G的类型( 有向图:0; 有向网:1; 无向图 :2; 无向网 3;)"<<endl;
scanf("%d",&G.kind);
switch(G.kind)
{
case UDG: CreateUDG();
break;
case UDN: CreateUDN();
break;
case DG: CreateDG();
break;
case DN: CreateDN();
break;
}
}
void Graph::CreateUDG()
{
/*采用数组(邻接矩阵)表示法,构造无向图G
以边为输入单位,即输入边的俩个顶点
关键在于判断输入顶点是否存在,返回其位置
*/
int i,j,IncInfo;//是否包含边或弧的相关信息
VertexType va,vb;
cout<<"请输入无向图的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
cin>>G.vexnum;//顶点数
cin>>G.arcnum;//边数
cin>>IncInfo;//是否具有相关信息的判断条件
cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
for(i=; i<G.vexnum; i++)//构造顶点向量
{
cin>>G.vex[i];
}
for(i=; i<G.vexnum; i++)//初始化邻接矩阵
{
for(j=; j<G.vexnum; j++)
{
G.arcs[i][j].adj=;//图
G.arcs[i][j].info="NULL";//初始化为空串
}
}
cout<<"请输入"<<G.arcnum<<"条边的顶点1,顶点2:"<<endl;
for(int k=; k<G.arcnum; k++)//按边录入信息
{
cin>>va;
i=LocateVex(va);//查询下标,va所在的行坐标
cin>>vb;
j=LocateVex(vb);//查询下标,vb所在的行坐标
G.arcs[i][j].adj=; //表示va 与 vb 相连 无向图
G.arcs[j][i].adj=; //表示va与vb相连 无向图
if(IncInfo)
{
cout<<"请输入该边相关信息"<<endl;
cin>>G.arcs[i][j].info; //输入字符串
G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
}
}
G.kind=UDG; //创建成功
}
void Graph::CreateUDN()
{
/*
原理和UDG相同,只是增加了权值的输入
*/
int i,j,IncInfo;//是否包含边或弧的相关信息
VertexType va,vb;
cout<<"请输入无向网的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
cin>>G.vexnum;//顶点数
cin>>G.arcnum;//边数
cin>>IncInfo;//是否具有相关信息的判断条件
cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
for(i=; i<G.vexnum; i++)//构造顶点向量
{
cin>>G.vex[i];
}
for(i=; i<G.vexnum; i++)//初始化邻接矩阵
{
for(j=; j<G.vexnum; j++)
{
G.arcs[i][j].adj=INFINITY;//网,无穷大表示不连接
G.arcs[i][j].info="NULL";//初始化为空串
}
}
for(int k=; k<G.arcnum; k++)//按边录入信息
{
cout<<"请输入第"<<k+<<"条边的顶点1,顶点2:"<<endl;
cin>>va;
i=LocateVex(va);//查询下标,va所在的行坐标
cin>>vb;
j=LocateVex(vb);//查询下标,vb所在的行坐标
cout<<"请输入权值"<<endl;
cin>>G.arcs[i][j].adj;
G.arcs[j][i].adj=G.arcs[i][j].adj;
if(IncInfo)
{
cout<<"请输入该边相关信息"<<endl;
cin>>G.arcs[i][j].info; //输入字符串
G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
}
}
G.kind=UDN; //创建成功
}
void Graph::CreateDG()
{
/*
原理与UDG相同,邻接矩阵略有区别
*/
int i,j,IncInfo;//是否包含边或弧的相关信息
VertexType va,vb;
cout<<"请输入有向图的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
cin>>G.vexnum;//顶点数
cin>>G.arcnum;//边数
cin>>IncInfo;//是否具有相关信息的判断条件
cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
for(i=; i<G.vexnum; i++)//构造顶点向量
{
cin>>G.vex[i];
}
for(i=; i<G.vexnum; i++)//初始化邻接矩阵
{
for(j=; j<G.vexnum; j++)
{
G.arcs[i][j].adj=;//图
G.arcs[i][j].info="NULL";//初始化为空串
}
}
cout<<"请输入"<<G.arcnum<<"条弧的弧头,弧尾:"<<endl;
for(int k=; k<G.arcnum; k++)//按边录入信息
{
cin>>va;
i=LocateVex(va);//查询下标,va所在的行坐标
cin>>vb;
j=LocateVex(vb);//查询下标,vb所在的行坐标
G.arcs[j][i].adj=; //表示vb(弧尾) 与 vb(弧头) 相连,也就是说vb可以到达va,反之不一定 有向图 vb——>va
if(IncInfo)
{
cout<<"请输入该弧相关信息"<<endl;
cin>>G.arcs[i][j].info; //输入字符串
G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
}
}
G.kind=DG; //创建成功
}
void Graph::CreateDN()
{
/*
原理和DG相同,只是增加了权值的输入
*/
int i,j,IncInfo;//是否包含边或弧的相关信息
VertexType va,vb;
cout<<"请输入有向网的顶点数,边数,变是否包含其他信息(是:1; 否;0;)"<<endl;
cin>>G.vexnum;//顶点数
cin>>G.arcnum;//边数
cin>>IncInfo;//是否具有相关信息的判断条件
cout<<"请输入"<<G.vexnum<<"个顶点的的值"<<endl;
for(i=; i<G.vexnum; i++)//构造顶点向量
{
cin>>G.vex[i];
}
for(i=; i<G.vexnum; i++)//初始化邻接矩阵
{
for(j=; j<G.vexnum; j++)
{
G.arcs[i][j].adj=INFINITY;//网,无穷大表示不连接
G.arcs[i][j].info="NULL";//初始化为空串
}
}
for(int k=; k<G.arcnum; k++)//按边录入信息
{
cout<<"请输入第"<<k+<<"条弧的弧头,弧尾:"<<endl;
cin>>va;
i=LocateVex(va);//查询下标,va所在的行坐标
cin>>vb;
j=LocateVex(vb);//查询下标,vb所在的行坐标
cout<<"请输入权值"<<endl;
cin>>G.arcs[j][i].adj;
if(IncInfo)
{
cout<<"请输入该弧相关信息"<<endl;
cin>>G.arcs[i][j].info; //输入字符串
G.arcs[j][i].info=G.arcs[i][j].info;//对称阵
}
}
G.kind=DN; //创建成功
}
int Graph::LocateVex(VertexType u)//给定顶点值,返回顶点在顶点数组中的下标,方便按边录入信息
{
for(int i=; i<G.vexnum; i++)
{
if(G.vex[i]==u)
{
return i;
}
}
return -;
}
void Graph::Display()
{
cout<<"顶点向量"<<endl;
for(int i=; i<G.vexnum; i++)
{
cout<<"顶点"<<G.vex[i]<<endl;
}
cout<<"邻接矩阵"<<endl;
for(int i=; i<G.vexnum; i++)
{
for(int j=;j<G.vexnum;j++)
{
cout<<G.arcs[i][j].adj<<"\t";
}
cout<<endl;
}
cout<<"顶点1 顶点2 信息"<<endl;
if(G.kind>) //对于无向图或者无向网来说,邻接矩阵是对称的
{
for(int i=; i<G.vexnum; i++)
{
for(int j=;j<i;j++)
{
if(G.arcs[i][j].adj!=&&G.arcs[i][j].adj!=INFINITY)
{
cout<<G.vex[i]<<"\t";
cout<<G.vex[j]<<"\t";
cout<<G.arcs[i][j].info<<endl;
}
}
}
}
else//对于有向图或者有向网来说,邻接矩阵必须要全部输出
{
for(int i=; i<G.vexnum; i++)
{
for(int j=;j<G.vexnum;j++)
{
if(G.arcs[i][j].adj!=&&G.arcs[i][j].adj!=INFINITY)
{
cout<<G.vex[i]<<"\t";
cout<<G.vex[j]<<"\t";
cout<<G.arcs[i][j].info<<endl;
}
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Graph g;
g.Display();
return ;
}
图的封装(C++)的更多相关文章
- 左右推拽显示对比图 - jQyery封装 - 附源文件
闲来无事,做了一个模块效果 左右拖拽显示对比图,是用jq封装的 利用鼠标距离左侧(0,0)坐标的横坐标位移来控制绝对定位的left值 再配合背景图fixed属性,来制作视觉差效果 代码如下 <! ...
- Echarts生成饼状图、条形图以及线形图 JS封装
1.在我们开发程序中,经常会用到生成一些报表,比方说饼状图,条形图,折线图等.不多说了,直接上封装好的代码,如下Echarts.js所示 以下代码是封装在Echarts.js文件中 /** * Cre ...
- JQ无缝轮播图-插件封装
类似京东的这种无缝轮播效果: 实例代码下载 HTML代码: <body> <!-- /*觅me 探索生活*/ --> <div class="test" ...
- echarts 拼图和折线图的封装 及常规处理
1.html <div id="wrap"></div> 2.js ; (function ($) { $.fn.extend({ echartsPie: ...
- springMvc-视图模型封装及注解参数
1.视图模型封装,ModelAndView可以向页面返回视图的同时吧模型也传入页面 2.注解参数,springMvc很好的地方在于简单,高效,@RequestParam注解能非常好的取得页面参数 代码 ...
- 一个手机图表(echarts)折线图的封装
//定义一组颜色值,按顺序取出 var colorGroup = ["#6ca3c4","#76bfa3","#ea8f7a"," ...
- 使用原生JS实现一个风箱式的demo,并封装了一个运动框架
声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...
- android 项目学习随笔十七(ListView、GridView显示组图)
ListView.GridView显示组图,处理机制相同 <?xml version="1.0" encoding="utf-8"?> <Li ...
- JS高级-数据结构的封装
最近在看了<数据结构与算法JavaScript描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...
随机推荐
- poj2728 生成树01分数规划 (二分答案)
给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...
- Nginx详解四:Nginx基础篇之目录和配置语法
一.安装目录 命令:rpm -ql nginx 二.编译参数 命令:nginx -V 三.Nginx基本配置语法 修改主配置文件 当Nginx读配置文件读到include /etc/nginx/con ...
- mysql下载源码方法
方法一 进入mysql官网:http://dev.mysql.com/downloads/mysql/ 选择相关的平台下载: 3.选择Source Code 选型后,拉倒网页下方,选择要下载的源码包 ...
- 如何上传项目到Git
1.首先下载Git,然后安装 我用的版本是Git-2.15.0-64-bit 2.在你的Git上创建一个新的Progect 创建完成后,会出现这样的窗口,红框圈出来的就是你的Git项目路径 3.在本地 ...
- Java+selenium之WebDriver的cookie,等待等高级操作(五)
1. 操作cookie // 增加一个 name = "name",value="value" 的 cookie Cookie cookie = new Coo ...
- .NoSuchBeanDefinitionException: No bean named 'userService' available
- IEDA序列化设置
- HDU 1695 GCD (莫比乌斯反演模板)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- java运算符-算数、赋值、比较
1.算术运算符 运算符是用来计算数据的符号.数据可以是常量,也可以是变量.被运算符操作的数我们称为操作数. 运算符 运算规则 范例 结果 + 正号 +3 3 + 加 2+3 5 + 连接字符串 “中” ...
- AtCoder Regular Contest 101
C题是个傻逼题, 一定是先向右,然后停了或者向左走到某一个点(左边同理)模拟就可以了 D题想了一会才想出来 和tjoi那道排序挺像的 二分答案变0/1来做 刚开始写的时候还把自己作为另外一类搞出来 这 ...