示例代码:

/*
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++图结构的图结构操作示例的更多相关文章

  1. java虚拟机的基本结构如图

    1 java虚拟机的基本结构如图: 1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字 ...

  2. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  3. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  4. HTTP协议图--HTTP 协议报文结构

    1.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文.请求端(客户端)的 HTTP 报文叫做请求报文:响应端(服务器端)的叫做响应报文.HTTP 报文本身是由多行(用 CR[car ...

  5. C#结构类型图

    C#结构类型图     分类: C#

  6. [置顶] openHAB 部分代码结构 UML 图

    openHAB 部分代码结构 UML 图 ModelRepository: ItemRegistry: ItemUIProvider: WebAppServlet:

  7. 怎么看时序图--nand flash的读操作详解(转载)

    出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知 ...

  8. 怎么看时序图--nand flash的读操作详解

    出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html 这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本 ...

  9. 怎么看时序图--nand flash的读操作详解 (转)

    这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 ...

  10. Java JNA (三)—— 结构体使用及简单示例

    JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...

随机推荐

  1. Hibernate的fetch

    hibernate抓取策略fetch具体解释一.hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join)測试用例:Student student = (Student ...

  2. C#导出数据到Excel通用的方法类

    导出数据到Excel通用的方法类,请应对需求自行修改. 资源下载列表 using System.Data; using System.IO; namespace IM.Common.Tools { p ...

  3. 灵活性比Listview更好的RecycleView

    RecycleView:是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好. RecyclerView与ListView原理是类似的:都 ...

  4. 修改用户的home路径

    1.直接修改/etc/passwd文件 2.usermod -d /hadoop -u 1531 附:usermod详细参数 语 法:usermod [-LU][-c <备注>][-d & ...

  5. NYOJ 284 坦克大战 bfs + 优先队列

    这类带权的边的图,直接广搜不行,要加上优先队列,这样得到的结果才是最优的,这样每次先找权值最小的,代码如下 #include <stdio.h> #include <iostream ...

  6. NuGet学习笔记(1)——初识NuGet及快速安装使用(转)

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  7. ASP.NET-FineUI开发实践-1

    用.Net开发3年,主要接触资产管理,生产流程,质量追溯,.Net在这方面还是很靠谱的.2月低接触FineUI,那时版本是3.0+,第一眼让我想起了ExtJs,其实就是用.Net封装了ExtJs让AS ...

  8. SGU131--NYOJ435

    参考blog http://m.blog.csdn.net/blog/u012760629/36927465 http://www.cppblog.com/menrowitianya/archive/ ...

  9. MVC接收以post形式传输的各种参数

    近日研究用wcf框架接收同事Android端以post形式传输的各种类型的参数,来做处理.但研究过程中问题比较多,首先键值对的形式是实现了,传输int,string类型都不成问题,但是到传输文件的时候 ...

  10. angularjs中的绑定策略“@”,“=”,“&”实例

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...