使用邻接表创建图,再使用队列实现对图的广度优先搜索
#include<iostream>
#include<string>
using namespace std;
//定义边节点的结构体
struct arcnode
{
int adjvex;
arcnode* nextarc;
int info;
};
//定义顶点的结构体
struct vnode
{
char data;
arcnode* firstarc;
};
//定义图的结构体
struct graph
{
vnode v[10];
int vexnum, arcnum;
};
int locatevex(graph g, char c)
{
for (int i = 0; i < g.vexnum; i++)
{
if (c == g.v[i].data)
{
return i;
}
}
}
//创建一个图
void create(graph &g)
{
cout << "请输入int类型的数据,分别是顶点数目和边数" << endl;
cin >> g.vexnum >> g.arcnum;
for (int i = 0; i < g.vexnum; i++)
{
//为简便起见直接定义顶点为5个,可以自行更改
string s = "abcde";
g.v[i].data = s[i];
g.v[i].firstarc = nullptr;
}
for (int k = 0; k < g.arcnum; k++)
{
char v1, v2;
cout << "请输入char类型的数据" << endl;
cin >> v1 >> v2;
int i = locatevex(g, v1);
int j = locatevex(g, v2);
cout << i << " " << j << endl;
arcnode *p1 = new arcnode;
p1->adjvex = j;
p1->nextarc = g.v[i].firstarc;
g.v[i].firstarc = p1;
arcnode *p2 = new arcnode;
p2->adjvex = i;
p2->nextarc = g.v[j].firstarc;
g.v[j].firstarc = p2;
}
}
//获取顶点的第一个子节点的编号
int firstadjvex(graph g, int u)
{
//cout << "下一节点:" << g.v[u].firstarc->adjvex << endl;
return g.v[u].firstarc->adjvex;
}
//获取子节点的下一个子节点的编号
int nextadjvex(graph g, int u, int w)
{
arcnode* p;
p = g.v[u].firstarc;
while (p->adjvex != w && p->nextarc)
{
p = p->nextarc;
}
if (p->nextarc)
{
return p->nextarc->adjvex;
}
else
{
//cout << "当前节点没有下一个值了" << endl;
return -1;
}
}
//创建一个队列
#define MAXSIZE 10
struct queue
{
int* base;
int front;
int rear;
};
void initqueue(queue &q)
{
q.base = new int[MAXSIZE];
if (!q.base)
{
return;
}
q.front = 0;
q.rear = 0;
}
int queuelength(queue q)
{
return (q.rear - q.front + MAXSIZE) % MAXSIZE;
}
void enqueue(queue &q, int e)
{
if ((q.rear + 1) % MAXSIZE == q.front)
{
cout << "队列已满!" << endl;
return;
}
q.base[q.rear] = e;
//cout << q.base[q.rear] << endl;
q.rear = (q.rear + 1) % MAXSIZE;
//cout << "rear:" << q.rear << endl;
}
void popque(queue &q, int &e)
{
if (q.front == q.rear)
{
cout << "队列为空!" << endl;
return;
}
e = q.base[q.front];
q.front = (q.front + 1) % MAXSIZE;
}
int gethead(queue q)
{
if (q.front == q.rear)
{
cout << "队列为空!" << endl;
}
else
{
return q.base[q.front];
}
}
int queueempty(queue q)
{
if (q.front == q.rear)
{
return 1;
}
else
{
return 0;
}
}
int visited[10] = { 0 };
queue q;
//广度优先搜索遍历无向图,使用了队列
void BFS(graph g, int v)
{
cout << v;
visited[v] = 1;
initqueue(q);
enqueue(q, v);
while (!queueempty(q))
{
int u;
popque(q, u);
//cout << "u:" << u<<endl;
for (int w = firstadjvex(g, u); w >= 0; w = nextadjvex(g, u, w))
{
if (!visited[w])
{
cout << w;
visited[w] = 1;
enqueue(q, w);
}
}
}
}
int main()
{
graph g;
create(g);
BFS(g, 0);
//测试代码
//cout << "***************" << endl;
//cout << firstadjvex(g, 2) << endl;
//cout << nextadjvex(g, 2, 4) << endl;
//cout << nextadjvex(g, 2, 3) << endl;
//cout << nextadjvex(g, 2, 1) << endl;
//cout << "***************" << endl;
//cout << g.v[2].firstarc->adjvex;
//cout << g.v[2].firstarc->nextarc->adjvex;
//cout << g.v[2].firstarc->nextarc->nextarc->adjvex;
//initqueue(q);
//int a = 0, b = 1, c = 2;
//enqueue(q, a);
//enqueue(q, b);
//enqueue(q, c);
//for (int i = 0; i < 3; i++)
//{
// cout << q.base[i] << endl;
//}
//cout << queuelength(q) << endl;
//cout << "***************" << endl;
//for (int i = 0; i < 10; i++)
//{
// cout << visited[i] << endl;
//}
system("pause");
return 0;
}