@【数据结构】(图-邻接表 广度优先遍历)
采用邻接表来实现图的存储,并输入输出邻接表的信息,并用邻接表来实现图的广度优先遍历。
生成邻接表:
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
#define INF 65535
using namespace std;
typedef char VextexType[10];
typedef struct edgenode
{
int adjvex; //相邻点序号
int weight; //边的权值
struct edgenode *nextarc; //下一条边的顶点
}ArcNode;
typedef struct vexnode
{
char data; //存放一个顶点的信息;
ArcNode *firstarc; //指向第一条边结点
}VHeadNode;
typedef struct
{
int n, e;
VHeadNode adjlist[MAX]; //单链表头结点指针
}AdjGraph; //图的邻接表类型
int location(AdjGraph &G, char a)
{
for (int i = 0; i < G.n; i++)
{
if (G.adjlist[i].data == a)
return i;
}
return -1;
}
void creategraph(AdjGraph *&G)
{
int i, j;
G = (AdjGraph*)malloc(sizeof(AdjGraph));
cout << "输入图的结点数及边数:";
int n, e;
cin >> n >> e;
G->n = n; G->e = e;
for (i = 0; i < n; i++)
G->adjlist[i].firstarc = NULL;
cout << "输入图的顶点:";
for (i = 0; i < G->n; i++)
cin >> G->adjlist[i].data;
char a, b;
int M,N,w[MAX];
cout << "请输入各边的权值和顶点:" << endl;
for (i = 0; i < G->e; i++)
{
cin >> w[i]>>a >> b;
M = location(*G, a);N= location(*G, b);
if (M != -1 && N != -1)
{
edgenode *p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = N;
p->weight = w[i];
p->nextarc = G->adjlist[M].firstarc;
G->adjlist[M].firstarc = p;
}
}
}
void out(AdjGraph *G)
{
ArcNode *p;
int i;
cout << "顶点-->相邻顶点序号 权值为:" << endl;
for (i = 0; i < G->n; i++)
{
cout << G->adjlist[i].data;
p=G->adjlist[i].firstarc;
if (p != NULL)
{
cout << "-->";
}
while (p != NULL)
{
cout << p->adjvex << " " << p->weight << " /";
p = p->nextarc;
}
cout << endl;
}
}
void BFST(AdjGraph *G,int vi)
{
int i, v, visited[MAX];
ArcNode *p;
int Qu[MAX], front = 0, rear = 0; //定义循环队列
for (i = 0; i < G->n; i++)
visited[i] = 0;
cout <<setw(2)<< G->adjlist[vi].data;
visited[vi] = 1;
rear = (rear + 1) % MAX; Qu[rear] = vi; //初始结点进队
while (front != rear) // 队不为空时
{
front = (front + 1) % MAX;
v = Qu[front]; //出队结点v
p = G->adjlist[v].firstarc; //查找v的第一个相邻点
while (p != NULL) //查找v的所有相邻点
{
if (visited[p->adjvex] == 0)
{
cout <<setw(2)<< G->adjlist[p->adjvex].data;
visited[p->adjvex] = 1;
rear = (rear + 1) % MAX; //进队
Qu[rear] = p->adjvex;
}
p = p->nextarc; //查找v的下一个邻接点
}
}
cout << endl;
}
void main()
{
AdjGraph *G;
creategraph(G);
out(G);
cout << endl;
cout << "广度优先遍历(从结点0开始):" << endl;
BFST(G, 0);
system("pause");
}
测试: