算法思想:
依次遍历邻接表中未被标记的节点
#include "stdafx.h" #include <iostream> #include <cstring> using namespace std; struct EdgeNode { int adjvex; //邻接点域 int weight; //存储权值 struct EdgeNode *next; //下一节点指针 }; struct VertexNode { int data; //点数据 struct EdgeNode *next; //指针域 }; class Graph { private: int vex_num; int edge_num; struct VertexNode *p; int *visit; public: Graph(int vex_num, int edge_num); ~Graph(); void CreateGraph(); void BFS(int start); //void Display(); }; Graph::Graph(int vex_num, int edge_num) { this->vex_num = vex_num; this->edge_num = edge_num; visit = new int[vex_num]; memset(visit, 0, sizeof(int)*vex_num); p = NULL; } Graph::~Graph() { struct EdgeNode *q1 = p->next; struct EdgeNode *q2; for (int i = 0; i < vex_num; ++i) { q1 = (p + i)->next; while (q1 != NULL) { q2 = q1; q1 = q1->next; delete []q2; } } } void Graph::CreateGraph() { int i, j, weight; cout << "input the imformation of vex" << endl; p = new struct VertexNode[vex_num]; for (int i = 0; i < vex_num; ++i) //初始化顶点表 { cin >> (p + i)->data; p[i].next = NULL; } cout << "input edge" << endl; for (int k = 0; k < edge_num; ++k) { cin >> i >> j >> weight; struct EdgeNode *q1 = new struct EdgeNode; q1->adjvex = j; q1->weight = weight; q1->next = (p + i - 1)->next; (p + i - 1)->next = q1; struct EdgeNode *q2 = new struct EdgeNode; q2->adjvex = i; q2->weight = weight; q2->next = (p + j - 1)->next; (p + j - 1)->next = q2; } } void Graph::BFS(int start) { struct EdgeNode *q; for (int i = 0; i < vex_num; ++i) { if (!visit[(p + start-1)->data-1]) { visit[(p + start-1)->data-1] = 1; cout << (p + start-1)->data << " "; } q = (p + i)->next; while (q != NULL) { if (!visit[q->adjvex - 1]) { cout << q->adjvex << " "; visit[q->adjvex - 1] = 1; } q = q->next; } } } int main() { Graph g(6, 8); g.CreateGraph(); g.BFS(1); return 0; }
注:本篇博客仅供本人参考学习使用