一.简述

  栈与队列,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图的遍历的更多相关文章

  1. 数据结构算法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 ...

  2. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  3. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  4. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  5. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  6. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  7. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  8. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  9. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

随机推荐

  1. getSelection、range 对象属性,方法理解,解释

    网上转了一圈发现没有selection方面的解释,自己捣鼓下 以这段文字为例子.. <p><b>法国国营铁路公司(SNCF)20日承认,</b>新订购的2000列火 ...

  2. c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法

      时钟 IO(输入.输出,如何配置) IO   数字和模拟资源可以通过25个I/O 引脚(C805 1F3 2 0 ),每个端口引脚都可以被定义为 通用I/O(GPIO)或 0 模拟输入 所有端口I ...

  3. Cadence 建立封装:多个引脚于芯片内部连接的封装建立方式

    Ti 家有一种片子,型号为CSD19534Q5A.此芯片的外观样式如图: 可以看到,这个片子共有8个引脚,其中5.6.7和8这四个引脚的内部是连接在一起的. Ti 在数据手册中也介绍了封装的样式: 下 ...

  4. px和em和rem的区别

    一.px特点: 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96 ...

  5. Learning jQuery, 4th Edition 勘误表

    来源于:http://book.learningjquery.com/3145/errata/ Chapter 1 page 14 The CSS snippet is correct, but it ...

  6. [转]Hibernate设置时间戳的默认值和更新时间的自动更新

    原文地址:http://blog.csdn.net/sushengmiyan/article/details/50360451 Generated and default property value ...

  7. git 创建别名

    git config --global alias.shortname command 例子如下 git config --global alias.psm 'push origin master' ...

  8. ES6新特性:Javascript中的Reflect对象

    Reflect介绍: Reflect这个对象在我的node(v4.4.3)中还没有实现, babel(6.7.7)也没有实现 ,新版本的chrome是支持的, ff比较早就支持Proxy和Reflec ...

  9. Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)

    接上篇<WebApi服务URI加密及验证的两种方式>,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的. 如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一 ...

  10. jquery读取iframe子页面和父页面的处理

    1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 ...