(编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。

希望这些能提供给初学者一些参考。

在VC++6.0下可运行,当初还写了不少注释。

【问题描述】

建立图的邻接矩阵存储结构,实现图的遍历

【基本要求】

·功能:建立图的邻接矩阵存储结构,实现图的BFS、DFS

·输入:输入连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始顶点序号

·输出:图的广度优先搜索序列、深度优先搜索

【模块划分】

1. 建立有向图的邻接表 CreateAdjMatrix()

2. 以邻接表作为存储结构实现深度优先搜索DFS()

3. 循环队列的初始化 InitQueue()

4. 判断循环队列是否为空 QueueEmpty()

5. 入队 EnQueue()

6. 出对 DeleteQueue()

7. 以邻接表作为存储结构实现广度优先搜索BFS()

8. main()函数调用 CreateAdjMatrix()形成有向图的邻接矩阵,调用函数DFS() 求得深度优先搜索序列,调用函数 BFS()求得广度优先搜索序列

#include <stdio.h>
#include <string.h>
#define MaxSize 10

/*邻接矩阵的数据结构*/
typedef struct
{
	char vexs[MaxSize];	//顶点数组
	int arcs[MaxSize][MaxSize];	//邻接矩阵
	int vexnum,arcnum;	//顶点数、边弧数
}AdjMatrix;

/*队列的数据结构*/
typedef struct
{
	int elem[MaxSize];
	int front,rear;
}CirQueue;

int visited[MaxSize];	//标志_是否访问过

/*建立无向图的邻接矩阵 Create AdjMatrix()*/
void CreateAdjMatrix(AdjMatrix *g)
{
	int i,j,k;
	printf("输入顶点数、边弧数\n");
	scanf("%d%d",&g->vexnum,&g->arcnum);
	getchar();

	printf("输入顶点值\n");
	for(i=0;i<g->vexnum;i++)
		scanf("%c",&g->vexs[i]);
	getchar();

	//初始化无向图
	for(i=0;i<g->vexnum;i++)
		for(j=0;j<g->vexnum;j++)
			g->arcs[i][j]=0;

	printf("输入边弧值\n");
	for(i=0;i<g->arcnum;i++)
	{
		scanf("%d%d",&j,&k);
		getchar();
		g->arcs[j][k]=1;
		g->arcs[k][j]=1;
	}
}

/*邻接矩阵实现 DFS()*/
void DFS(AdjMatrix *g, int i)
{
	visited[i]=1;
	printf("%3c ",g->vexs[i]);

	for(int j=0;j<g->vexnum;j++)
		if(g->arcs[i][j] && (!visited[j]))
			DFS(g,j);
}

/*入队列 EnQueue()*/
void EnQueue(CirQueue *q, int e)
{
	if(q->front==(q->rear+1)%MaxSize)
		printf("Full!");
	else
	{
		q->rear=(q->rear+1)%MaxSize;
		q->elem[q->rear]=e;
	}
}

/*出队列 DeleteQueue()*/
void DeleteQueue(CirQueue *q, int *e)
{
	if(q->front==q->rear)
		return;
	*e=q->elem[(q->front+1)%MaxSize];
	q->front=(q->front+1)%MaxSize;
}

/*邻接矩阵实现 BFS()*/
void BFS(AdjMatrix *g, int i)
{
	int j,k;
	CirQueue Q;
	memset(visited,0,sizeof(visited));

	printf("%3c ",g->vexs[i]);
	visited[i]=1;
	Q.front=0;
	Q.rear=0;
	EnQueue(&Q,i);

	while(!(Q.front==Q.rear))
	{
		DeleteQueue(&Q,&j);
		for(k=0;k<g->vexnum;k++)
			if(g->arcs[j][k]&&(!visited[k]))
			{
				printf("%3c ",g->vexs[k]);
				visited[k]=1;
				EnQueue(&Q,k);
			}
	}
}

/*主函数 main*/
int main()
{
	AdjMatrix *g, a;
	char ch,c;
	int i,j;
	g=&a;

	printf("建立无向图的邻接矩阵\n");
	CreateAdjMatrix(g);

	printf("无向图的邻接矩阵为\n");
	for(i=0;i<g->vexnum;i++)
	{
		for(j=0;j<g->vexnum;j++)
			printf("%4d",g->arcs[i][j]);
		printf("\n");
	}

	printf("深度优先搜索\n");
	memset(visited,0,sizeof(visited));
	DFS(g,0);
	printf("\n");

	printf("广度优先搜索\n");
	BFS(g,0);
	printf("\n");
}

时间: 2024-10-09 12:30:51

(编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS的相关文章

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

(编程训练)再回首,数据结构——(升级版)使用栈判断括号匹配

点击打开 基础版 最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. /* ********************************************************** * 3-2 * 设在一个算术表达式中允许使用3种括号:圆括号"(".")",方 * 括号"["."]",花括号"

(编程训练)再回首,数据结构——哈夫曼编码的实现

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. [问题描述] 根据给定字符的使用频率,为其设计哈夫曼编码 [基本要求] ·功能:求出n个字符的哈夫曼编码 ·输入:输入n个字符和字符在电文中的使用频率 ·输出:n个字符的哈夫曼编码 [模块划分] 1.    初始化哈夫曼树函数 InitHuffmanTree() 2.    输入权值函数 InputWeight() 3.    选择

(编程训练)再回首,数据结构——二叉排序树的建立

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. [问题描述] 以输入的一组整数作为关键字的值,构造其对应的二叉排序树,并对给点的值在该二叉排序树上进行查找 [基本要求] ·输入:输入一组关键字(整数)及要查找的值 ·输出:排好序的关键字及查找的结果 样例输入 60 35 69 84 96 13 66 34 21 -1 40 样例输出 13 21 34 35 60 66 69 84

再回首数据结构—AVL树(二)

前面主要介绍了AVL的基本概念与结构,下面开始详细介绍AVL的实现细节: AVL树实现的关键点 AVL树与二叉搜索树结构类似,但又有些细微的区别,从上面AVL树的介绍我们知道它需要维护其左右节点平衡,实现AVL树关键在于标注节点高度.计算平衡因子.维护左右子树平衡这三点,下面分别介绍: 标注节点高度 从上面AVL树的定义中我们知道AVL树其左右节点高度差不能超过一,所以我们需要标注出每个节点高度: 1.节点高度为最大的子节点高度加1,其中叶子节点高度为1: 2.1与4叶子节点高度为1,节点3高度

无向图的邻接表创建

大话数据结构第一版第二次印刷中P231-P232中的无向图的邻接表创建,有一点小问题.修改了http://blog.csdn.net/jnu_simba/article/details/8866844的代码,Qt Creater测试可以运行. #include<iostream> #include<stdlib.h> using namespace std; #define MAXVEX 5 /* 最大顶点数,应由用户定义 */ typedef char VertexType[3]

设计模式之SOLID原则再回首

    本科阶段学过设计模式,那时对设计模式的五大原则--SOLID原则的概念与理解还是比较模糊,此时过去了2年时间,在学习<高级软件工程>课程中老师又提到了设计模式,课程中还详细讨论了五大原则的过程,这次SOLID原则再回首作者提出了一些更通俗的理解吧~ 一. 什么是设计模式?     那么,什么是设计模式呢? 从广义角度讲设计模式是可解决一类软件问题并能重复使用的设计方案; 从狭义角度讲设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,是在类和对象的层次描述的可重复

看数据结构写代码(35) 图的邻接矩阵表示法

杂谈:最近清明小长假,好好的放松了一下.节前 和 节后 都有点 松懈.不好,不好.贵在坚持.加油. 图的邻接矩阵表示法是用 两个数组 来表示 图的数据结构.一个是顶点数组,另一个是邻接矩阵数组.邻接矩阵 里存放着 顶点的关系. 用邻接矩阵表示图,在 看 顶点之间 是否有边,或者 求顶点的度等操作时比较简单.但空间浪费巨大,在插入,删除 顶点 和边 操作时 需要 移动大量数据,造成不便.所以在插入删除比较多,节点数比较多的时候 不宜 使用这种结构. 下面上代码: 源代码网盘地址:点击打开链接 //

再回首,Java温故知新&mdash;&mdash;开篇说明

不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其然而已.最近打算利用晚上的自由时间再学习一遍Java,所以入手了一本Java经典书籍——<Java核心技术 卷Ⅰ>.而博客也打算开始<再回首,Java温故知新>系列记录自己学习过程中一些要点,希望自己通过这次的学习不仅可以做到知其然,也能做到知其所以然,同时也希望这系列博客可以帮到一些