图的存储结构的实现(C/C++实现)
存档:
#include <stdio.h>
#include <stdlib.h>
#define maxv 10
#define max 10
typedef char elem;
typedef int elemtype;
#include "queue.h"
#include "mgraph.h"
void main()
{
mgraph g;
printf("1.初始化函数测试:\n");
initial(g);
printf("2.创建函数测试:\n");
create(g);
printf("3.输出函数测试:\n");
printg(g);
printf("4.输出顶点度函数测试:\n");
degree(g);
printf("5.深度优先遍历函数测试:\n");
dfstraverse(g);
printf("6.广度优先遍历函数测试:\n");
bfs(g);
}
//有向图的邻接矩阵,顶点数据为字符型
typedef struct MGraph
{
elem vexes[maxv];//顶点表
int edges[maxv][maxv];//邻接矩阵
int n,e;//顶点数n和边数e
}mgraph;
bool visited[maxv];//访问标志数组
void initial(mgraph &g)//初始化函数
{
int i,j;
g.e=;
g.n=;
for(j=;j<maxv;j++)
g.vexes[j]=;//建立顶点表
for(i=;i<maxv;i++)
{
for(j=;j<maxv;j++)
{
g.edges[i][j]=;//初始化邻接矩阵
}
}
}
int locate(mgraph g,elem u)//查找顶点对应的数组下标值
{
for(int i=;i<g.n;i++)
{
if(g.vexes[i]==u)
return i;
}
return -;
}
void create(mgraph &g)//创建图的邻接矩阵存储
{
int i,j,k;
elem u,v;
printf("请输入有向图的顶点数:");
scanf("%d",&g.n);
printf("请输入有向图的弧数:");
scanf("%d",&g.e);
fflush(stdin);//清空缓存中的数据
printf("请输入字符型顶点数据,如ABCD:");
for(j=;j<g.n;j++)
scanf("%c",&g.vexes[j]);//建立顶点表
fflush(stdin);
printf("请输入弧的信息,格式:弧尾,弧头\n");
for(k=;k<g.e;k++)
{
scanf("%c,%c",&u,&v);
i=locate(g,u);
j=locate(g,v);
g.edges[i][j]=;
fflush(stdin);
}
}
void printg(mgraph g)//输出有向图的邻接矩阵
{
int i,j;
printf("输入图的邻接矩阵存储信息:\n");
printf("顶点数据:\n");
for(i=;i<g.n;i++)
printf("%d:%c\n",i,g.vexes[i]);
printf("邻接矩阵数据:\n");
for(i=;i<g.n;i++)
{
for(j=;j<g.n;j++)
{
printf("%3d",g.edges[i][j]);
}
printf("\n");
}
}
void degree(mgraph g)//输出顶点的度
{
int i,j,in,out;
for(i=;i<g.n;i++)
{
in=;
out=;
for(j=;j<g.n;j++)
{
if(g.edges[i][j]!=)
out++;
if(g.edges[j][i]!=)
in++;
}
printf("顶点%c的出度为%d---入度为%d---度为%d\n",g.vexes[i],out,in,in+out);
}
}
int firstadjvex(mgraph g,int v)//顶点v的第一个邻接顶点
{
for(int i=;i<g.n;i++)
{
if(g.edges[v][i]==)
return i;
}
return -;
}
int nextadjvex(mgraph g,int v,int w)//顶点v的相对于w的下一个邻接顶点
{
for(int i=w+;i<g.n;i++)
{
if(g.edges[v][i]==)
return i;
}
return -;
}
void dfs(mgraph g,int v)//遍历一个连通分量
{
int w;
visited[v]=true;
printf("%c ",g.vexes[v]);
for(w=firstadjvex(g,v);w>=;w=nextadjvex(g,v,w))
{
if(!visited[w])
dfs(g,w);
}
}
void dfstraverse(mgraph g)//深度优先遍历
{
int v;
for(v=;v<g.n;v++)
visited[v]=false;//标志访问数组初始化
for(v=;v<g.n;v++)
{
if(!visited[v])
dfs(g,v);
}
}
void bfs(mgraph g)//广度优先遍历
{
int u=,v=,w=;
queue q;
for(v=;v<g.n;v++)
visited[v]=false;
initqueue(q);
for(v=;v<g.n;v++)
{
if(!visited[v])
{
visited[v]=true;
printf("%c ",g.vexes[v]);
enqueue(q,v);
while(!queueempty(q))
{
dequeue(q,u);
for(w=firstadjvex(g,u);w>=;w=nextadjvex(g,u,w))
{
if(!visited[w])
{
visited[w]=true;
printf("%c ",g.vexes[w]);
enqueue(q,w);
}
}
}
}
}
destroyqueue(q);
}
typedef struct
{
elemtype *base;//动态分配存储空间
int front;//头指针,若队列不空指向队列头元素
int rear;//尾指针,若队列不空指向队列尾元素的下一个位置
}queue;
void initqueue(queue &q)//初始化队列
{
q.base=new elemtype[max];//分配存储空间
if(!q.base)
{
printf("队列分配失败\n");
exit(-);
}
else
q.front=q.rear=;
}
int queueempty(queue q)//判断队列是否为空
{
if(q.front==q.rear)
return ;
else
return ;
}
void enqueue(queue &q,elemtype e)//入队列操作
{
if((q.rear+)%max==q.front)
{
printf("队满,无法插入新元素!\n");
exit(-);
}
else
{
q.base[q.rear]=e;
q.rear=(q.rear+)%max;
}
}
void dequeue(queue &q,elemtype e)//出队列操作
{
if(q.front==q.rear)//判断队列是否为空
{
printf("空队列,无法删除头元素!\n");
exit(-);
}
else
{
e=q.base[q.front];
q.front=(q.front+)%max;
}
}
void destroyqueue(queue &q)//销毁队列
{
free(q.base);
q.base=NULL;
q.front=;
q.rear=;
printf("\n");
}
运行结果如下:


图的存储结构的实现(C/C++实现)的更多相关文章
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...
- K:图的存储结构
常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...
- 图的存储结构(邻接矩阵与邻接表)及其C++实现
一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...
- 【algo&ds】6.图及其存储结构、遍历
1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...
- 【PHP数据结构】图的存储结构
图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- 图的存储结构与操作--C语言实现
图(graph)是一种比树结构还要复杂的数据结构,它的术语,存储方式,遍历方式,用途都比较广,所以如果想要一次性完成所有的代码,那代码会非常长.所以,我将分两次来完成图的代码.这一次,我会完成图的五种 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
- Search Quick Union Find(图的存储结构)
Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...
随机推荐
- 《决战大数据:驾驭未来商业的利器》【PDF】下载
内容简介 大数据时代的来临,给当今的商业带来了极大的冲击,多数电商人无不"谈大数据色变",并呈现出一种观望.迷茫.手足无措的状态.车品觉,作为一名经验丰富的电商人,在敬畏大数据的同 ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- [Maven] Missing artifact
今天从朋友那拷过来一个maven工程,eclipse中maven配置好了,maven仓库也配置完毕,但是一直报Missing artifact,然后开网执行maven update,下载完jar后,还 ...
- C++各种指针辨析
1)int *p p与*结合,表明p是一个指针 然后前面int说明p是一个整形的指针 2)int *p[n] 因为[]比*优先级高,所以p先与[]结合,表明p是个数组,然后这个数组在与*结合,说明数组 ...
- 搭建lnmp教程
LNMP指的是一个基于CentOS/Debian 上安装Nginx.PHP.MySQL.php.可以在独立主机上轻松的安装LNMP生产环境. 1 安装nginx 如果是一台新的服务器可直接安装(若以前 ...
- ElasticSearch 学习记录之父子结构的查询
父子结构 父亲type属性查询子type 的类型 父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息 POST /product/_search { "query": ...
- c语言中的转义序列
c中的输出函数printf()可以带以下的转义序列,不同的转义序列会得到不同的结果. 1.\a:警报 2.\b:退格(光标回退一格)3.\f:换页4.\n:换行(光标去到下一行的起始处)5.\r:回车 ...
- vim编辑器的使用技巧
vim(vi)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...
- IE8下实现兼容rgba
昨天遇到一个问题,要实现一个背景透明的效果,用CSS3用rgba()就能实现,即 background: rgba(0,0,0,.5); 但是要兼容到IE8,就发现没有透明效果,因为IE8不支持rgb ...
- 鸟哥的linux私房菜学习-(五)Linux系统的在线求助man page与info page
1.man page man是manual(操作说明)的简写啦!只要下达:『man date』 马上就会有清楚的说明出现在你面前喔!如下所示: 进入man命令的功能后,你可以按下『空格键』往下翻页,可 ...