数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述
栈与队列,DFS与BFS。仅以连接表为例实现。
二.头文件
BFS要用到的头文件
//3_4_part1.h
/**
author:zhaoyu
email:zhaoyu1995.com@gmail.com
date:2016-6-9
2016-6-25修改版,针对第七章
note:realize my textbook <<数据结构(C语言版)>>
*/
//Page 64
#include <cstdio>
#include "head.h"
#define QElemType int
//----循环队列:队列的顺序存储结构----
#define MAXQSIZE 10 //最大队列长度
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
//----循环队列的基本操作说明及实现----
Status InitQueue(SqQueue &Q)
{
//构造一个空队列 Q
Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if (!Q.base)
{
exit(OVERFLOW);
}
Q.front = Q.rear = ;
return OK;
}
int QueueLength(SqQueue Q)
{
//返回 Q 的元素个数,即队列的长度
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
Status EnQueue(SqQueue &Q, QElemType e)
{
//插入元素 e 为 Q 的新的队尾元素
if ((Q.rear+)%MAXQSIZE == Q.front)
{
return ERROR;//队列满
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear+)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q, QElemType &e)
{
//若队列不空,则删除 Q 的队列头元素,用 e 返回其值,
//并返回 OK,否则返回 ERROR
if (Q.front == Q.rear)
{
return ERROR;
}
e = Q.base[Q.front];
Q.front = (Q.front+)%MAXQSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if (Q.front == Q.rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
void PrintQueue(SqQueue Q)
{
int cnt = Q.front;
if (Q.front == Q.rear)
{
printf("void\n");
return;
}
while ((cnt+)%MAXQSIZE != Q.rear)
{
//printf("%d\t%d\n",Q.base[cnt++], cnt);输出好奇怪
printf("%d\t", Q.base[cnt]);
cnt++;
}
printf("%d\n", Q.base[cnt]);
}
3_4_part2.h
存储结构用到的头文件
//filename:7_2_part2.h
//date:2016-6-20
//author:zhaoyu
//note:
//----图的邻接表存储表示----
#include "head.h"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX_VERTEX_NUM 20
#define VertexType int
#define InfoType char
#define Graph ALGraph
typedef struct ArcNode{
int adjvex;//该弧所指向的顶点位置
struct ArcNode *nextarc;//指向下一条弧的指针
InfoType *info;//该弧相关信息的指针
}ArcNode;
typedef struct VNode{
VertexType data;//顶点信息
ArcNode *firstarc;//指向第一条依附该顶点的弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph; void AddNode(ALGraph &G, int v, int w)
{
G.vertices[v].data = v;
if (NULL == G.vertices[v].firstarc)
{
G.vertices[v].firstarc = (ArcNode *)malloc(sizeof(ArcNode));
G.vertices[v].firstarc->nextarc = NULL;
G.vertices[v].firstarc->adjvex = w;
G.vertices[v].firstarc->info = NULL;
return;
}
ArcNode *temp = G.vertices[v].firstarc;
while (temp->nextarc)
{
temp = temp->nextarc;
}
ArcNode *move = (ArcNode *)malloc(sizeof(ArcNode));
move->nextarc = NULL;
move->adjvex = w;
move->info = NULL;
temp->nextarc = move;
}
void CreateALGraph(ALGraph &G)
{
for (int i = ; i < MAX_VERTEX_NUM; i++)
{
G.vertices[i].firstarc = NULL;
}
printf("input vexnum and arcnum(1~MAX):\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
int v, w;
for (int i = ; i < G.arcnum; i++)
{
scanf("%d%d", &v, &w);
AddNode(G, v, w);
AddNode(G, w, v);
}
}
Status Visit(int v)
{
printf("%d->", v);
}
int FirstAdjVex(ALGraph G, int v)
{
if (NULL != G.vertices[v].firstarc)
{
return G.vertices[v].firstarc->adjvex;
}
else
{
return -;
}
}
int NextAdjVex(Graph G, int v, int w)
{
if (NULL != G.vertices[v].firstarc)
{
ArcNode *temp = G.vertices[v].firstarc;
while (temp != NULL)
{
if (temp->adjvex == w)
{
if (NULL != temp->nextarc)
{
return temp->nextarc->adjvex;
}
else
{
return -;
}
}
temp = temp->nextarc;
}
return -;
}
else
{
return -;
}
}
7_2_part2.h
其他
//filename:7_3.h
//date:2016-6-25
//author:
//note:仅以邻接表为例
#include "7_2_part2.h"
#include "3_4_part2.h"
#define Boolean int
#define MAX MAX_VERTEX_NUM
Boolean visited[MAX];//访问标志数组
Status (* VisitFunc)(int v);//函数变量
/**
algorithm 7.5
*/
void DFS(Graph G, int v)
{
visited[v] = TRUE;
VisitFunc(v);//访问第 v 个结点
for (int w = FirstAdjVex(G, v); w >= ; w = NextAdjVex(G, v, w))
{
if (!visited[w])
{
DFS(G, w);//对 v 的尚未访问的邻接顶点,递归调用 DFS
}
}
}
/**
algorithm 7.4
*/
void DFSTraverse(Graph G, Status (* Visit)(int v))
{//对图 G 做深度游优先遍历
VisitFunc = Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数
for (int v = ; v < G.vexnum; ++v)
{
visited[v] = FALSE;
}
for (int v = ; v < G.vexnum; ++v)
{
if (!visited[v])
{
DFS(G, v);
}
}
printf("\b\b \n");
} void BFSTraverse(Graph G, Status (* Visit)(int v))
{//按广度优先非递归遍历图 G,使用辅助队列 Q 和访问标志数组 visited
for (int v = ; v < G.vexnum; ++v)
{
visited[v] = FALSE;
}
SqQueue Q;
InitQueue(Q);//置空的辅助队列 Q
for (int v = ; v < G.vexnum; ++v)
{
if (!visited[v])//v 尚未访问
{
visited[v] = TRUE;
Visit(v);
EnQueue(Q, v);// v 入队列
while (!QueueEmpty(Q))
{
int u = -;
DeQueue(Q, u);//队头元素出队并置为 u
for (int w = FirstAdjVex(G, u); w >= ; w = NextAdjVex(G, u, w))
{//w 为 u 尚未访问的邻居节点
if (!visited[w])
{
visited[w] = TRUE;
Visit(w);
EnQueue(Q, w);
}
}
}
}
}
printf("\b\b \n");
}
7_3.h
三.CPP文件
#include "7_3.h"
int main(int argc, char const *argv[])
{
ALGraph G;
CreateALGraph(G);
printf("DFS Traverse\t");
DFSTraverse(G, Visit);
printf("BFS Traverse\t");
BFSTraverse(G, Visit);
return ;
}
7_3.cpp
四.测试
以书本上的图为例
数据结构算法C语言实现(二十七)--- 7.2图的遍历的更多相关文章
- 数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现
一.简述 理解数组位置的计算公式 LOC(j1, j2, ···, jn) = LOC(0, 0, ..., 0) + (b2 x ··· x bn x j1 + b3 x ··· x bn x j2 ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
- 二十七、Java图形化界面设计——容器(JFrame)
摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
随机推荐
- hadoop: hdfs API示例
利用hdfs的api,可以实现向hdfs的文件.目录读写,利用这一套API可以设计一个简易的山寨版云盘,见下图: 为了方便操作,将常用的文件读写操作封装了一个工具类: import org.apach ...
- 浅谈设计模式--建造器模式(Builder Pattern)
建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...
- PAT 1067. Sort with Swap(0,*)
1067. Sort with Swap(0,*) (25) Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...
- 常用 redis 命令(for php)
Redis 主要能存储 5 种数据结构,分别是 strings,hashes,lists,sets 以及 sorted sets. 新建一个 redis 数据库 $redis = new Redis( ...
- 各种主流 SQLServer 迁移到 MySQL 工具对比
我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品).首次需要数据转换是测试环节,当时为了快速验证新研发 ...
- 基于DDD的.NET开发框架 - ABP日志Logger集成
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- 1118ALTER TABLE tabname DISCARD TABLESPACE快速导入数据利用表空间
-- 快速导入数据如果你有.ibd文件的一个干净的备份,你可以按如下操作从被起源的地方恢复它到MySQL安装中:相当快速 1. 发出这个ALTER TABLE语句: 2. ALTER TABLE tb ...
- PHP Apache 配置伪静态
1.首先是开启rewrite_module(如何开启,百度搜索) 2.创建.htaccess文件(如何创建,百度搜索) 3.在.htaccess文件中打开重写服务:RewriteEngine On 4 ...
- 使用while循环输入 1 2 3 4 5 6 8 9 10
n = 1 while n<11: if n==7: pass else: print(n) n = n +1
- [转]oracle学习入门系列之五内存结构、数据库结构、进程
原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...