一.简述

  栈与队列,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. C#:DataTable映射成Model

    这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理. 反射自然必不可少的,另外考 ...

  2. 在GoF设计模式

    在GoF设计模式中,结构型模式有: 1.适配器模式 Adapter   适配器模式是将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.   ...

  3. 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数

    肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...

  4. 将某个Qt4项目升级到Qt5遇到的问题[转]

    该Qt4项目以前是使用Qt4.7.4 MSVC2008开发的,因为使用到了OWC10(Office Web Components),使用MSVC编译器的话无法正常升级到Qt4.8.x和Qt5,于是将编 ...

  5. Webwork 学习之路【01】Webwork与 Struct 的前世今生

    Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...

  6. Jmeter测试工具使用

    启动Jmeter: 路径:\apache-jmeter-2.13\bin\jmeter.bat 一.测试Http请求: 建立过程: 1.  测试计划--添加---Threads--线程组 2.  线程 ...

  7. scrollTop和offsetTop的区别,scrollTopLeft和offsetLeft的区别

    scrollTop和offsetTop的区别:scrollTop是指某个可滚动区块向下滚动的距离,比如向下滚动了10个像素,那么这个元素的scrollTop属性值就是10,这个属性的值是可读写的,且不 ...

  8. C# 属性、索引

    属性(property): public string Name { get { return _name; } set { _name = value; } } 简写为: public string ...

  9. jQuery基础--样式篇(5)

    jQuery的属性与样式 (1).attr()与.removeAttr():每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息. attr()有4个表达式 attr(传入 ...

  10. 一个Activity掌握Design新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51295364 谷歌在推出Android5.0的同时推出了全新的设计Material Desig ...