#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//图的邻接表类型定义
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 10000 //定义一个无限大的值
#define MaxSize 50 //最大顶点个数
typedef enum{DG,DN,UG,UN}GraphKind; //图的类型:有向图、有向网、无向图和无向网
//边结点的类型定义
typedef struct ArcNode{
int adjvex; //邻接点域,弧指向的顶点的位置
InfoPtr *info; //与弧相关的信息
struct ArcNode *nextarc; //指示下一个与该顶点相邻接的顶点
}ArcNode;
//头结点的类型定义
typedef struct VNode{
VertexType data; //用于存储顶点
ArcNode *firstarc; //指示第一个与该顶点邻接的顶点
}VNode,AdjList[MaxSize];
//图的类型定义
typedef struct{
AdjList vertex;
int vexnum,arcnum; //图的顶点数目与弧的数目
GraphKind kind; //图的类型
}AdjGraph; int visited[MaxSize];//訪问标志数组
//返回图中顶点相应的位置
int LocateVertex(AdjGraph G,VertexType v){
int i;
for(i=0;i<G.vexnum;i++)
if(strcmp(G.vertex[i].data,v)==0)
return i;
return -1;
}
//採用邻接表存储结构,创建无向图G
void CreateGraph(AdjGraph *G){
int i,j,k;
VertexType v1,v2; //定义两个顶点v1和v2
ArcNode *p;
printf("请输入图的顶点数,边数(逗号分隔): ");
scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);
printf("请输入%d个顶点的值:\n",G->vexnum);
for(i=0;i<G->vexnum;i++){
scanf("%s",G->vertex[i].data);
G->vertex[i].firstarc=NULL; //将相关联的顶点置为空
}
printf("请输入弧尾和弧头(以空格作为间隔):\n");
for(k=0;k<G->arcnum;k++){ //建立边链表
scanf("%s%s",v1,v2);
i=LocateVertex(*G,v1);
j=LocateVertex(*G,v2);
//j为弧头i为弧尾创建邻接表
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=NULL;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
//i为弧头j为弧尾创建邻接表
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
p->info=NULL;
p->nextarc=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;
}
(*G).kind=UG;
}
//销毁无向图G
void DestroyGraph(AdjGraph *G){
int i;
ArcNode *p,*q;
for(i=0;i<(*G).vexnum;++i){ //释放图中的边表结点
p=G->vertex[i].firstarc; //p指向边表的第一个结点
if(p!=NULL){ //假设边表不为空。则释放边表的结点
q=p->nextarc;
free(p);
p=q;
}
}
(*G).vexnum=0; //将顶点数置为0
(*G).arcnum=0; //将边的数目置为0
}
//返回顶点v的第一个邻接顶点的序号
int FirstAdjVertex(AdjGraph G,VertexType v){
ArcNode *p;
int v1;
v1=LocateVertex(G,v); //v1为顶点v在图G中的序号
p=G.vertex[v1].firstarc;
if(p) //假设顶点v的第一个邻接点存在,返回邻接点的序号,否则返回-1
return p->adjvex;
else
return -1;
}
//返回v的相对于w的下一个邻接顶点的序号
int NextAdjVertex(AdjGraph G,VertexType v,VertexType w){
ArcNode *p,*next;
int v1,w1;
v1=LocateVertex(G,v); //v1为顶点v在图G中的序号
w1=LocateVertex(G,w); //w1为顶点w在图G中的序号
for(next=G.vertex[v1].firstarc;next;)
if(next->adjvex!=w1)
next=next->nextarc;
p=next; //p指向顶点v的邻接顶点w的结点
if(!p||!p->nextarc) //假设w不存在或w是最后一个邻接点,则返回-1
return -1;
else
return p->nextarc->adjvex; //返回v的相对于w的下一个邻接点的序号
}
void Visit(VertexType v){
printf("%s ",v);
}
//图的非递归深度优先遍历
void DFSTraverse2(AdjGraph G,int v){
int i,visited[MaxSize],top;
ArcNode *stack[MaxSize],*p;
for(i=0;i<G.vexnum;i++) //将全部顶点都加入未訪问标志
visited[i]=0;
Visit(G.vertex[v].data); //訪问顶点v并将訪问标志置为1。表示已经訪问
visited[v]=1;
top=-1; //初始化栈
p=G.vertex[v].firstarc; //p指向顶点v的第一个邻接点
while(top>-1||p!=NULL){
while(p!=NULL)
if(visited[p->adjvex]==1) //假设p指向的顶点已经訪问过,则p指向下一个邻接点
p=p->nextarc;
else{
Visit(G.vertex[p->adjvex].data); //訪问p指向的顶点
visited[p->adjvex]=1;
stack[++top]=p; //保存p指向的顶点
p=G.vertex[p->adjvex].firstarc; //p指向当前顶点的第一个邻接点
}
if(top>-1){
p=stack[top--]; //假设当前顶点都已经被訪问。则退栈
p=p->nextarc; //p指向下一个邻接点
}
}
}
//从第1个顶点出发,按广度优先非递归遍历图G
void BFSTraverse(AdjGraph G){
int v,front,rear;
ArcNode *p;
int queue[MaxSize]; //定义一个队列Q
front=rear=-1; //初始化队列Q
for(v=0;v<G.vexnum;v++) //初始化标志位
visited[v]=0;
v=0;
visited[v]=1; //设置訪问标志为1,表示已经被訪问过
Visit(G.vertex[v].data);
rear=(rear+1)%MaxSize;
queue[rear]=v; //v入队列
while(front<rear){ //假设队列不空
front=(front+1)%MaxSize;
v=queue[front]; //队头元素出队赋值给v
p=G.vertex[v].firstarc;
while(p!=NULL){ //遍历序号为v的全部邻接点
if(visited[p->adjvex]==0){ //假设该顶点未被訪问过
visited[p->adjvex]=1;
Visit(G.vertex[p->adjvex].data);
rear=(rear+1)%MaxSize;
queue[rear]=p->adjvex;
}
p=p->nextarc; //p指向下一个邻接点
}
}
}
//从顶点v出发递归深度优先遍历图G
void DFS(AdjGraph G,int v){
int w;
visited[v]=1;
Visit(G.vertex[v].data);
for(w=FirstAdjVertex(G,G.vertex[v].data);w>=0;w=NextAdjVertex(G,G.vertex[v].data,G.vertex[w].data))
if(!visited[w])
DFS(G,w); //递归调用DFS对v的尚未訪问的序号为w的邻接顶点
}
//从第1个顶点起,深度优先遍历图G
void DFSTraverse(AdjGraph G){
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
printf("\n");
}
void main(){
AdjGraph G;
printf("採用邻接矩阵创建无向图G:\n");
CreateGraph(&G);
printf("图G的深度优先遍历:");
DFSTraverse2(G,0);
printf("\n");
printf("图G的广度优先遍历:");
BFSTraverse(G);
printf("\n");
DestroyGraph(&G);
system("pause");
}

_DataStructure_C_Impl:图的遍历的更多相关文章

  1. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

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

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

  3. Kruskal和prime算法的类实现,图的遍历BFS算法。

    一.图的遍历 #include<iostream> #include<queue> #include<vector> using namespace std; in ...

  4. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  5. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  6. 图的遍历算法:DFS、BFS

    在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...

  7. 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

    算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...

  8. python 回溯法 子集树模板 系列 —— 8、图的遍历

    问题 一个图: A --> B A --> C B --> C B --> D B --> E C --> A C --> D D --> C E -- ...

  9. [图的遍历&多标准] 1087. All Roads Lead to Rome (30)

    1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...

随机推荐

  1. cesium primitive方式 ————http://blog.sina.com.cn/s/blog_15e866bbe0102y0ji.html

    Cesium学习笔记-工具篇17-PrimitivePoint自定义渲染-点 (2018-08-28 16:12:06) 转载▼ 标签: cesium primitive 自定义渲染 shader c ...

  2. .less css 使用 LESS 简化层叠样式表(CSS)的编写(另外一种css框架 sass)

    使用 LESS 简化层叠样式表(CSS)的编写 https://less.bootcss.com/ Sass完全兼容所有版本的CSS https://gojs.net/latest/samples/f ...

  3. JavaSE-14 异常处理

    学习要点 使用try-catch-finally处理异常 使用throw.throws抛出异常 异常及其分类 log4j记录日志 异常 1  异常的定义 异常是指在程序的运行过程中所发生的不正常的事件 ...

  4. CGPathAddArc

    使用CGPathAddArc使UIView的Layer绕中心点旋转 2012-12-04 15:38 775人阅读 评论(0) 收藏 举报 animationAnimationiosiOSIOSlay ...

  5. ie兼容的解决办法,6,7、8、9、10

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html> ...

  6. 你知道你常用的dos和linux命令吗?

    功能 Linux MS-DOS 进入到该目录 cd cd 列举文件 ls dir 创建目录 mkdir mkdir 清除屏幕 clear cls 复制文件 cp copy 移动文件 mv move 删 ...

  7. 【06】对AJAX的总结(转)

    对AJAX的总结   通过前面对 AJAX 的讲解,我们可以将 AJAX 请求分成以下几个步骤: 创建 XMLHttpRequest 对象: 设置事件处理函数,处理返回的数据: 初始化并发送请求. 可 ...

  8. 关于Web服务接口测试的一些问题及答案

    本篇主要是像想要了解并且学习接口测试的朋友,做一个入门的简单介绍 1.什么是接口 答:接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提 ...

  9. HDU-1083Courses,二分图模板题!

    Courses                                                                                             ...

  10. CSU 1259 bfs找最短路

    题目大意: 不想介绍,题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1259 bfs求最短路. 这里因为2-9,到达同样的点不计步数,那我 ...