图的遍历DFS与BFS(邻接表)

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <queue>
#include <Windows.h>using namespace std;#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20  //顶点最多个数
#define LENGTH 5           //顶点字符长度//*********************************邻接表***********************************begin
typedef char VertexType[LENGTH];
typedef struct ArcNode
{int adjvex;struct ArcNode* nextarc;int weight;
}ArcNode;typedef struct VNode
{VertexType data;ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];typedef struct
{AdjList vertices;int vexnum;int arcnum;
}ALGraph;int LocateVex(const ALGraph & g, char name[LENGTH])
{for (int i = 0; i < g.vexnum; i++){if (0 == strcmp(g.vertices[i].data, name)){return i;}}return -1;
}//图的建造
void CreateGraph(ALGraph &g)
{ifstream fcin(_T("graph.txt"));fcin>>g.vexnum;for (int i = 0; i < g.vexnum; i++){fcin>>g.vertices[i].data;g.vertices[i].firstarc = NULL;}fcin>>g.arcnum;char arcHead[LENGTH];char arcTail[LENGTH];int weight;ArcNode *p, *q;ArcNode *pTmp;for (int i = 0; i < g.arcnum; i++){memset(arcHead, 0, LENGTH);memset(arcTail, 0, LENGTH);fcin>>arcTail>>arcHead>>weight;int x = LocateVex(g, arcHead);int y = LocateVex(g, arcTail);p = new ArcNode;q = new ArcNode;p->adjvex = y;p->nextarc = NULL;p->weight = weight;q->adjvex = x;q->nextarc = NULL;q->weight = weight;if (NULL == g.vertices[x].firstarc){ g.vertices[x].firstarc = p;}else{for (pTmp = g.vertices[x].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc){;}pTmp->nextarc = p;}if (NULL == g.vertices[y].firstarc){ g.vertices[y].firstarc = q;}else{for (pTmp = g.vertices[y].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc){;}pTmp->nextarc = q;}/*p->adjvex = y;p->nextarc = g.vertices[x].firstarc;p->weight = weight;g.vertices[x].firstarc = p;q->adjvex = x;q->nextarc = g.vertices[y].firstarc;q->weight = weight;g.vertices[y].firstarc = q;*/}
}//v的第一个邻接点
int FirstAdjVex(const ALGraph &g, int v)
{if ( NULL != g.vertices[v].firstarc){return g.vertices[v].firstarc->adjvex;}return -1;
}//v相对于w的下一个邻接点
int NextAdjVex(const ALGraph &g, int v, int w)
{ArcNode *p;for (p = g.vertices[v].firstarc; NULL != p; p = p->nextarc){if (p->adjvex == w && p->nextarc != NULL){return p->nextarc->adjvex;}}return -1;
}//*********************************邻接表***********************************end//深度优先遍历
bool visit[MAX_VERTEX_NUM];void DFS (ALGraph& g, int v)
{visit[v] = true;cout<<g.vertices[v].data<<'\t';for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w)){if (!visit[w]){DFS(g, w);}}
}void DFSTraverse(ALGraph &g)
{for (int v = 0; v < g.vexnum; v++){visit[v] = false;}for (int v = 0; v < g.vexnum; v++){if (!visit[v]){DFS(g, v);}}cout<<endl;
}//广度优先遍历
void BFSTraverse(ALGraph &g, char vName[LENGTH])
{int pos = LocateVex(g, vName);for (int v = 0; v < g.vexnum; v++){visit[v] = false;}queue<int> q;if (!visit[pos]){cout<<g.vertices[pos].data<<'\t';visit[pos] = true;}q.push(pos);while (!q.empty()){int v = q.front();q.pop();for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w)){if (!visit[w]){cout<<g.vertices[w].data<<'\t';visit[w] = true;q.push(w);}}}cout<<endl;
}//辅助函数,设置控制台的颜色
void SetConsoleTextColor(WORD dwColor)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);if (INVALID_HANDLE_VALUE == handle){return;}SetConsoleTextAttribute(handle, dwColor);
}int _tmain(int argc, _TCHAR* argv[])
{ALGraph graph;CreateGraph(graph);SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);cout<<"**************************DFS****************************"<<endl<<endl;DFSTraverse(graph);SetConsoleTextColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);cout<<"**************************BFS****************************"<<endl<<endl;BFSTraverse(graph, "V1");return 0;
}

界面运行如下:

建造图的graph.txt文本内容如下:

8
V1 V2 V3 V4 V5 V6 V7 V8 
10
V1 V2 10
V1 V3 50
V2 V4 30
V3 V5 40
V3 V6 99
V4 V5 2
V4 V7 60
V5 V7 80
V6 V8 22
V7 V8 70

转载于:https://www.cnblogs.com/venow/archive/2012/08/14/2638911.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归求n的阶层算法实现

专题:递归 定义:一个函数自己直接或间接调用自己 递归满足三个条件 1、递归必须得有-一个明确的中止条件 2、该函数所处理的数据规模必须在递减 3、这个转化必须是可解的 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib…

递归求1到100的和算法演示

循环和递归 递归:易于理解、速度慢、存储空间大 循环&#xff1a;不易理解、速度快、存储空间小 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>long sum_sum(int n) {if (1 n) {return 1;}else {int sum n sum…

递归实现汉诺塔程序

[将汉诺塔]这不是线性递归&#xff0c;这是个非线性递归! n1 1 n2 3 n3 7 ................. n64 2的64次方减1 [这是个天文数字&#xff0c;就算世界上最快的计算机也解决不了 汉诺塔的复杂度是2的n次方减一 问题很复杂&#xff0c;恒真正解决问题的编码就…

解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错&#xff1a;scanf_s函数报错:没有为格式字符串传递足够的参数 int main() {char s1[20] "i m name";char *p1, *p2;char s3[10] {0};p1 s1;p2 s3;printf("请输入你的名字: \n");scanf_s("%s",&s3);printf("%s\n", s3);f…

已知先序和中序求后序

先序: ABCDEFGH 中序: BDCEAFHG 求后序:DECBHGFA 具体看B站郝斌视频&#xff1a;https://www.bilibili.com/video/BV11s41167h6?p71

微软的Surface平板电脑RT版,RT是什么缩写?|转|

http://www.guokr.com/question/240887/ 1# 其实rt是win8家族的新成员&#xff0c;专为arm系列处理器设计的windows 8版本&#xff0c;不兼容win32程序 2# zzllrr 2012-06-21 09:28:19 找到权威解答了&#xff1a;“RT”代表“Runtime”的意思。既Windows Runtime Library&…

字符串移位包含

题目&#xff1a;给定两个字符串s1和s2&#xff0c;要求判定s2是否能够被s1做循环移位得到的字符串包含。例如&#xff0c;给定s1AABCD和s2CDAA,返回true;给定s1ABCD和s2ACBD,返回false。 答&#xff1a; #include "stdafx.h" #include <iostream>using namesp…

C++分文件的编写函数

不分文件编写函数&#xff1a; #include<iostream>using namespace std;//函数的声明 void swap(int a, int b); //函数的定义void swap(int a, int b) {int temp a;a b;b temp;cout << "a的值" << a << endl;cout << "b的值…

C++ 空指针和野指针

//1&#xff0c;指针变量指向内存中编号为0的空间为空指针 //2&#xff0c;空指针指向的内存空间是不可以访问的 #include<iostream> using namespace std; int main() {int a 10;int * p &a;cout << p << endl;cout << &a << e…

GL 与 CV 管线 (pipeline) 比较与相互转换

这里把二者作一个比较&#xff0c;并对相关的矩阵做一个联系以使能够相互转换。 1. CV中图像形成过程 (transformation stages) 这一过程可概括为四个坐标系的转换&#xff0c;分别为&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系&#xff0c;如下图&#xff1a…

C++结构体作为函数参数传参

#include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;/**结构体作为函数参数传参*/ //值传递 void printStufdent1(struct Student st3) {cout << "子函数" << endl;st3.…

C++结构体中const使用场景

看如下代码&#xff1a; #include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;//值传递 void printStufdents(struct Student st2) {cout << "子函数" << endl;st2.age…

C++结构体案例

#include<iostream> using namespace std;#include<string>//学生结构体 struct Student {string name;int age;int score; };struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数 void allocateSpace(struct Teacher tArray…

C++ rand()函数和srand()函数

随机数和伪随机的区别 &#xff1a; #include<iostream> using namespace std; #include<string>#include<string> #include <stdlib.h> #include <time.h> #define MIN 0 //随机数产生的范围 #define MAX 99 //函数声明…

301重定向IIS设置,及伪静态后 301重定向出错案例分享

301重定向&#xff0c;网络上的知识已经很多了&#xff0c;我在这第一次实践过程中&#xff0c;出现了一个算是低级的错误&#xff0c;但也比较典型&#xff0c;也许其它新手也会碰到&#xff0c;分享一下&#xff1a; 一、301重定向实施&#xff1a; 我们哪里体检网&#xff0…

C++ 通讯录设计(一)

#include<iostream> #include<string> using namespace std;//- 封装函数显示该界面如void showMenu() // - 在main函数中调用封装好的函数//菜单界面函数功能 void showMenu() {cout << "***********************" << endl;cout << &…

C++ 通讯录设计(二)

功能描述: 实现添加联系人功能&#xff0c;联系人上限为1000人&#xff0c;联系人信息包括(姓名、性别、年龄、联系电话、家庭住址) 添加联系人实现步骤: ●设计联系人结构体 ●设计通讯录结构体 ●main函数中创建通讯录 ●封装添加联系人函数 ●测试添加联系人功能 1.1&#…

C++ 通讯录设计(三)

显示联系人 功能描述:显示通讯录中已有的联系人信息 显示联系人实现步骤: . ●封装显示联系人函数 ●测试显示联系人功能 1.1封装显示联系人函数 思路:判断如果当前通讯录中没有人员,就提示记录为空&#xff0c;人数大于0,显示通讯录中信息 //显示联系人 void showPerson(Addr…

C++ 通讯录设计(四)

1、删除联系人 功能描述:按照姓名进行删除指定联系人 删除联系人实现步骤: ●封装检测联系人是否存在 ●封装删除联系人函数 ●测试删除联系人功能 1.1封装检测联系人是否存在 设计思路: 删除联系人前&#xff0c;我们需要先判断用户输入的联系人是否存在&#xff0c;如果存在删…

C++ 通讯录设计(五)

1、查找联系人 功能描述:按照姓名查看指定联系人信恿 查找联系人实现步骤 ●封装查找联系人函数 ●测试查找指定联系人 1.1封装查找联系人函数 实现思路:判断用户指定的联系人是否存在&#xff0c;如果存在显示信息&#xff0c;不存在则提示查无此人。 查找联系人代码: //4、查…