示例代码:

/*
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. Config配置文件读写

    config文件读写操作(文字说明附加在程序中) App.config文件 <?xml version="1.0" encoding="utf-8" ?& ...

  2. POJ3750

    #include <iostream> #include <stdio.h> #include <cstring> using namespace std; int ...

  3. ViewState探索

    什么是 view state? View State是客户端状态管理重要机制之一.当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值.ASP.NET把View State属性作为页面 ...

  4. url的非法字符有哪些

    需要过滤的特殊字符及字符串有: net user xp_cmdshell /add exec master.dbo.xp_cmdshell net localgroup administrators ...

  5. dom方法读取xml(不常用)

    Book.java package com.xml.demo; public class Book { private int id; private String name; private Flo ...

  6. 手动安装svn到eclipse

    今天为了装个svn搞得我焦头烂额~ 1.下载site-1.10.10.zip.(http://download.csdn.net/download/codepython/9082533) 2.在ecl ...

  7. Android自定义扁平化对话框

    平时我们开发的大多数的Android.iOS的APP,它们的风格都是拟物化设计.如今Android 4.X.iOS 7.WP8采用的是扁平化设计,可以看出扁平化设计是未来UI设计的趋势.其实扁平化设计 ...

  8. Android开发之InstanceState详解(转)

    本文来自:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html 本文介绍Android中关于Activity的两个神秘方法: ...

  9. InnoDB概览

    InnoDB 采用了MVCC来支持高并发,并且实现了四个标准的隔离级别.其默认级别是REPEATABLE READ(可重复读) ,并且,通过间隙锁(next-key locking)策略防止幻读的出现 ...

  10. JNDI Tutorial

    Naming Concepts A fundamental facility in any computing system is the naming service--the means by w ...