存档:

 #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++实现)的更多相关文章

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

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

  2. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  3. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  4. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  5. 【PHP数据结构】图的存储结构

    图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...

  6. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

  7. 图的存储结构与操作--C语言实现

    图(graph)是一种比树结构还要复杂的数据结构,它的术语,存储方式,遍历方式,用途都比较广,所以如果想要一次性完成所有的代码,那代码会非常长.所以,我将分两次来完成图的代码.这一次,我会完成图的五种 ...

  8. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  9. Search Quick Union Find(图的存储结构)

    Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...

随机推荐

  1. 排序sort,统计wc

    [root@localhost ~]# sort /etc/passwd 注释:默认按字母升序排 abrt:x::::/etc/abrt:/sbin/nologin adm:x:::adm:/var/ ...

  2. 页面重绘(repaint)和回流(reflow)

    前言 页面显示到浏览器上的过程: 1.1.生成一个DOM树. 浏览器将获取到的HTML代码解析成1个DOM树,包含了所有标签,包括display:none和动态添加的节点. 1.2.生成样式结构体. ...

  3. listbox控件使用

    1. 属性列表: SelectionMode    组件中条目的选择类型,即多选(Multiple).单选(Single)    Rows             列表框中显示总共多少行    Sel ...

  4. 6.Nginx作为负载均衡服务器应用

    案例:Nginx作为负载均衡服务器应用 nginx的负载均衡功能是通过upstream命令实现的,因此他的负载均衡机制比较简单,是一个基于内容和应用的7层交换负载均衡的实现.Nginx负载均衡默认对后 ...

  5. iOS音频采集过程中的音效实现

    1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...

  6. Selenide UI 自动化测试

       我没有拼写错误,确实不是 Selenium ,但是,只要是 Web UI 自动化测试框架,基本上都是基于Selenium 的.Selenide 也不例外.那为啥不直接用Selenium呢? 因为 ...

  7. FPGA 设计总结(1)

    1. set_input_delay和set_output_delay的选项-max和-min的理解 首先 input/output其实是模拟数据在端口外的延时,是一个外部约束条件,目的是为了约束FP ...

  8. Webpack 2 视频教程 018 - 使用可视化图表进行统计分析打包过程

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  9. datatable使用笔记

    这是一个使用datatable的jsp文件实例,实现了点击单元格后编辑单元格所在行的内容. <%@ page pageEncoding="UTF-8"%> <!D ...

  10. vlc源码研究

    有位传说中的大神告诉我,我的p2p打洞打不通是因为,sdp描述信息中的地址不对 也就是IN IP4 XXX.XXX.X.XXX这一句 我看到确实是个局域网地址,那么vlc在接收到IN IP4 XXX. ...