大话数据结构
Unit6 图
2.邻接表的构建和广度遍历
代码
#include <iostream>
#include <queue>
#include <algorithm>
typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
using namespace std;
int visited[100];
//边表结点
typedef struct EdgeNode {
int adjvex; //顶点对应下标
EdgeType weight; //权值
struct EdgeNode* next; //指针,指向下一个表结点
}EdgeNode;
//顶点表结点
typedef struct VertexNode {
VertexType data; //顶点域,存储顶点信息
EdgeNode* firstedge; //边表头指针
}VertexNode, AdjList[MAXVEX];
typedef struct {
AdjList adjlist;
int numVertexes, numEdges; //图中当前顶点数和边数
}GraphAdjlist;
void CreateGraph(GraphAdjlist* G) {
int i, j, k;
EdgeNode* e;
cout << "输入顶点数和边数:" << endl;
cin >> G->numVertexes >> G->numEdges;
//建立顶点表
for (i = 0;i < G->numVertexes;i++) {
cout << "请输入顶点值" << endl;
cin >> G->adjlist[i].data;
G->adjlist[i].firstedge = NULL;
}
for (k = 0;k < G->numEdges;k++) {
cout << "输入边上的顶点序号:" << endl; // 输入边(vi,vj)的边表
cin >> i >> j;
//前插法
//若用尾插法还需尾指针
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge = e;
/*e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjlist[j].firstedge;
G->adjlist[j].firstedge = e;*/
}
}
//邻接表深度遍历算法
void BFSTraverse(GraphAdjlist GL) {
int i;
EdgeNode* p;
queue<char> Q;
for (i = 0;i < GL.numVertexes;i++) {
visited[i] = false;
}
//InitQueue;
for (i = 0; i < GL.numVertexes;i++) {
if (!visited[i]) {
visited[i] = true;
cout << GL.adjlist[i].data;
Q.push(i);
while (!Q.empty()) {
Q.pop();
p = GL.adjlist[i].firstedge;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = true;
cout << GL.adjlist[p->adjvex].data;
Q.push(p->adjvex);
}
p = p->next;
}
}
}
}
}
int main() {
GraphAdjlist* grap = (GraphAdjlist*)malloc(sizeof(GraphAdjlist));
CreateGraph(grap);
BFSTraverse(*grap);
free(grap);
return 0;
}
运行结果