C++图结构的图结构操作示例
示例代码:
/*
By qianshou
2013/10/5明天就要开学了~哎~
*/
#include<iostream>
using namespace std;
/*******************准备数据*****************************/
#define MaxNum 20 //图的最大顶点数
#define MaxValue 65535 //最大值
struct GraphMatrix
{
char Vertex[MaxNum]; //保存顶点信息(序号或字母)
int GType; //图的类型(0:无向图,1:有向图)
int VertexNum; //顶点的数量
int EdgeNum; //边的数量
int EdgeWeight[MaxNum][MaxNum]; //保存边的权值
int IsTrav[MaxNum]; //遍历标志(用来标示是否被访问过)
};
/******************创建图********************************/
void CreateGraph(GraphMatrix *GM)
{
void ClearGraph(GraphMatrix *GM);
int i,j,k;
int weight; //权值
char EstartV,EendV; //边的起点和终点
cout<<"请输入图的类型:0.表示无向图;1表示有向图:";
cin>>GM->GType;
cout<<"请输入顶点的数量:";
cin>>GM->VertexNum;
cout<<"请输入图中的顶点信息:"<<endl;
for(i=0;i<GM->VertexNum;i++) //输入结点
{
cout<<"第"<<(i+1)<<"个顶点:";
cin>>GM->Vertex[i]; //保存到顶点数组中
}
ClearGraph(GM);
cout<<"请输入边的个数:"<<endl;
cin>>GM->EdgeNum;
cout<<"输入每条边对应的起点,终点,以及权值:"<<endl;
for(k=0;k<GM->EdgeNum;k++)
{
cout<<"第"<<k+1<<"条边:";
cin>>EstartV>>EendV>>weight;
for(i=0;GM->Vertex[i]!=EstartV;i++); //在已有结点中查找起点
for(j=0;GM->Vertex[j]!=EendV;j++); //在已有结点中查找终点
GM->EdgeWeight[i][j]= weight; //在二维数组中保存对应的权值
if(GM->GType==0) //如果该图为无向图
{
GM->EdgeWeight[j][i]=weight; //在对角位置保存权值
}
}
}
/**********************清空图*************************************************/
void ClearGraph(GraphMatrix *GM)
{
int i,j;
for(i=0;i<GM->VertexNum;i++)
{
for(j=0;j<GM->VertexNum;j++)
{
GM->EdgeWeight[i][j]=MaxValue; //使矩阵中的元素都为MaxValue
}
}
}
/**********************显示图(输出对应的邻接矩阵)*****************************/
void OutGraph(GraphMatrix *GM)
{
int i,j;
for(j=0;j<GM->VertexNum;j++)
{
cout<<"\t"<<GM->Vertex[j]; //在第一行输出结点信息
}
cout<<endl;
for(i=0;i<GM->VertexNum;i++)
{
cout<<GM->Vertex[i];
for(j=0;j<GM->VertexNum;j++)
{
if(GM->EdgeWeight[i][j]==MaxValue)
{
cout<<"\t"<<'Z'; //输出Z表示无穷大
}
else
{
cout<<"\t"<<GM->EdgeWeight[i][j];
}
}
cout<<endl;
}
}
/***********************深度优先遍历算法***********************************/
void DeepTraOne(GraphMatrix *GM,int n)
{
int i;
GM->IsTrav[n]=1; //表示该顶点已经处理过
cout<<"->"<<GM->Vertex[n]; //输出标记过的顶点
//执行处理结点的操作
for(i=0;i<GM->VertexNum;i++)
{
if(GM->EdgeWeight[n][i]!=MaxValue&&!GM->IsTrav[i])
{
DeepTraOne(GM,i); //递归进行遍历
}
}
}
void DeepTraGraph(GraphMatrix *GM)
{
int i;
for(i=0;i<GM->VertexNum;i++) //清楚各顶点遍历标志
{
GM->IsTrav[i]=0;
}
cout<<"深度遍历结点:"<<endl;
for(i=0;i<GM->VertexNum;i++)
{
if(!GM->IsTrav[i]) //若该顶点没有被访问过
{
DeepTraOne(GM,i); //调用函数遍历
}
}
cout<<endl;
}
/**********************主函数部分******************************************/
int main()
{
GraphMatrix *GM;
CreateGraph(GM);
OutGraph(GM);
DeepTraGraph(GM);
return 0;
}
程序运行结果:
实际的图结构应该是是这样的:
C++图结构的图结构操作示例的更多相关文章
- java虚拟机的基本结构如图
1 java虚拟机的基本结构如图: 1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字 ...
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...
- HTTP协议图--HTTP 协议报文结构
1.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文.请求端(客户端)的 HTTP 报文叫做请求报文:响应端(服务器端)的叫做响应报文.HTTP 报文本身是由多行(用 CR[car ...
- C#结构类型图
C#结构类型图 分类: C#
- [置顶]
openHAB 部分代码结构 UML 图
openHAB 部分代码结构 UML 图 ModelRepository: ItemRegistry: ItemUIProvider: WebAppServlet:
- 怎么看时序图--nand flash的读操作详解(转载)
出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知 ...
- 怎么看时序图--nand flash的读操作详解
出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html 这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本 ...
- 怎么看时序图--nand flash的读操作详解 (转)
这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 ...
- Java JNA (三)—— 结构体使用及简单示例
JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...
随机推荐
- 查看linux版本号的几种方法
(1)lsb_release 命令查看,FSG(Free Standards Group)组织开发的LSB (Linux Standard Base)标准的一个命令,用来查看linux兼容性的发行版信 ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- 数据结构笔记01:编程面试过程中常见的10大算法(java)
以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...
- 【转】[Algorithm]01分数规划
因为搜索关于CFRound277.5E题的题解时发现了这篇文章,很多地方都有值得借鉴的东西,因此转了过来 原文:http://www.cnblogs.com/perseawe/archive/2012 ...
- Apache调优
1.调整文件描述符大小,默认Linux系统的文件描述符是1024,对于squid等一些服务来说 在高负载的情况下这些文件描述符是远远不够的,所以在部署该类服务器时修改文件 ...
- C#面向对象的一些笔记
抽象 抽象类通常表示一个抽象的概念,提供一个继承的出发点.当设计抽下类时候,尽可能的拥有更多的相同代码,更少的数据. 抽象类.方法用abstract关键字修饰: 抽象成员不能是private. 抽象类 ...
- mysql复制表
create table 表名 like 要复制的表名 //复制表结构 insert into 表名 select * from 要复制的表名 //复制数据 方法2,一般不推荐,如果后台加数据,可 ...
- mysql window下tmpdir空间耗尽
修改my.ini或my-default.ini文件[mysqld]下方配置 tmpdir = D:/tmp
- maven 整理
1. 打包命令: mvn package -DskipTests 2. 发布命令: mvn deploy -DperformRelease=true
- div边框阴影的实现【转载】
box-shadow:阴影水平偏移值(可取正负值): 阴影垂直偏移值(可取正负值):阴影模糊值:阴影颜色: Firefox支持Box Shadow(阴影):-moz-box-shadow:2px 2p ...