图的封装(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描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...
随机推荐
- Winhex数据恢复学习笔记(四)
睡不着,那就深夜写篇笔记打发一下不瞌睡,❥(^_-) 1.winhex在文件批量处理上主要是针对批量保存.打开.关闭,主要还是基于批量打开的其他一些操作,这里通过构造通配符来批量打开,列如 *符号 ? ...
- centos7.5上一步步部署jumpserver
1.基础环境:centos7.5:关闭防火墙和selinux 2.修改字符集,否则可能会报input/output error 的问题,因为日志里打印了中文 [root@xzw ~]# localed ...
- (转) Golang的单引号、双引号与反引号
Go语言的字符串类型string在本质上就与其他语言的字符串类型不同: Java的String.C++的std::string以及Python3的str类型都只是定宽字符序列 Go语言的字符串是一个用 ...
- Java 9 中的 9 个新特性你知道吗
摘要: Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 J ...
- .NoSuchBeanDefinitionException: No bean named 'userService' available
- Python函数系列之eval()
1.作用:将字符串str当成有效的表达式来求值并返回计算结果. 2.语法:eval(source[, globals[, locals]]) 3.说明:参数:source:一个Python表达式或函 ...
- 【C#】wpf中的xmlns命名空间为什么是一个网址,代表了什么意思(转载)
原文:https://blog.csdn.net/catshitone/article/details/71213371 新建一个wpf的项目,我们先来看下它默认的命名空间都是哪些? 可以看到xmln ...
- jdk1.8学习、jdk1.9学习、jdk10.0学习和总结
由于中文参考资料很少,参考链接: https://www.oschina.net/translate/109-new-features-in-jdk-10 http://chuansong.me/n/ ...
- [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)
来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...
- TypeScript学习笔记 (一)基础特性
一. 字符串新特性 1. 多行字符串 var str = ``; 2. 字符串模板 var world = "world"; var str = `hello ${world}`; ...