#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