用广度优先遍历邻接表,却只能出现三个顶点,为啥?
以下是代码:
//图的邻接表存储定义
typedef struct ANode
{
int adjvex;//该边的终点编号
struct ANode* nextarc;//指向下一条边的指针
InfoType weight;//该边的权值等信息
}ArcNode;
typedef char Vertex[10];
typedef struct Vnode
{
Vertex data;//顶点信息
ArcNode* firstarc;//指向第一条边
}VNode;
typedef struct
{
VNode adjlist[MAXV];//邻接表
int n1, e1;//顶点数n和边数e
}AdjGraph;
typedef struct
{
int data[MAXV];//存放队中元素
int front, rear;//队头、队尾指针
}SqQueue;
//初始化邻接表
void InitALGraph(AdjGraph* A)
{
A = (AdjGraph*)malloc(sizeof(AdjGraph));
A->n1 = 0;
A->e1 = 0;
}
//建立邻接表AdjGraph
void CreateALGraph(AdjGraph*& A)
{
A = (AdjGraph*)malloc(sizeof(AdjGraph));
int i, j = 0,w=0;
ArcNode* L=0;
cout << "请输入顶点数和边数:";
cin >> A->n1 >> A->e1;
//cout << "输入顶点信息(A B C...):";
for (i = 0; i < A->n1; i++)
{
//cin >> A->adjlist[i].data;//输入顶点信息
A->adjlist[i].firstarc = 0;//将邻接表初始化
}
cout << "输入边(vi,vj)上的顶点序号以及权值:";
for (int k = 0; k < A->e1; k++)
{
cin >> i >> j>>w;
L = (ArcNode*)malloc(sizeof(ArcNode));
L->adjvex = j;//边的终点编号
L->nextarc = A->adjlist[i].firstarc;
L->weight = w;
A->adjlist[i].firstarc = L;//将当前顶点的指针指向L
L = (ArcNode*)malloc(sizeof(ArcNode));
L->adjvex = i;
L->nextarc = A->adjlist[j].firstarc;
L->weight = w;
A->adjlist[j].firstarc = L;
}
cout <<endl;
DispALGraph(A,L);
}
//输出邻接表
void DispALGraph(AdjGraph* A,ArcNode*L)//
{
cout << "图的邻接表:" << endl;
for (int i = 0; i < A->n1; i++)
{
L = A->adjlist[i].firstarc;
cout << i << " ";
while (L)
{
cout << "→" << L->adjvex << " " << L->weight<<"(权重)";
L = L->nextarc;
}
cout << endl;
}
}
//初始化队列
void InitQueue(SqQueue*& qu)
{
qu = (SqQueue*)malloc(sizeof(SqQueue));
qu->front = 0;
qu->rear = 0;
}
//入队
bool enQueue(SqQueue*& qu,int e)
{
if ((qu->rear+1)%MAXV==qu->front)
return false;
qu->data[qu->rear] = e;//rear位置插入元素
qu->rear = (qu->rear + 1) % MAXV;
return true;
}
//出队
bool deQueue(SqQueue*& qu, int e)
{
if (qu->rear == qu->front)//队空
return false;
e = qu->data[qu->front];
qu->front = (qu->front + 1) % MAXV;
return true;
}
//判断队列空
bool QueueEmpty(SqQueue*& qu)
{
if (qu->front == qu->rear)
return true;
return false;
}
int _visited[20] = { 0 };
//广度优先遍历
void BFS(AdjGraph* A, int v)
{
int w = 0,j=0;
ArcNode* p;
SqQueue* qu;//定义队列指针
InitQueue(qu);//初始化队列
cout << v << " ";
_visited[v] = 1;
enQueue(qu, v);//v入队
while (!QueueEmpty(qu))
{
deQueue(qu, w);//出队一个顶点w
p = A->adjlist[w].firstarc;//指向w第一个邻接点
while (p!=NULL)
{
//j = p->adjvex;
if (_visited[p->adjvex] == 0)//当前结点未被访问
{
cout << p->adjvex<<" ";//访问该邻接点
_visited[p->adjvex] = 1;//标记已访问
enQueue(qu, p->adjvex);//该顶点进队
}
p=p->nextarc;
}
}
cout << endl;
}
int main()
{
AdjGraph* A=0;
InitALGraph(A);
CreateALGraph(A);
cout << "广度优先遍历:";
BFS(A, 0);
}
如果只能出现三个顶点,则可能是遍历过程出了问题。
在广度优先遍历中,需要使用队列来存储遍历的顶点。首先将起点放入队列,然后开始遍历。每次从队列中取出一个顶点,如果它还未被访问过,则将它标记为已访问,并将它的所有邻接顶点放入队列。这样,每个顶点只会被遍历一次,直到遍历完整个图为止。
如果只能出现三个顶点,可能是由于队列未能正确存储遍历过程中的顶点导致的。可以检查队列的存储方式是否正确,确保队列能够按照正确的顺序存储顶点。
另外,也可以检查遍历过程中的访问标记是否正确,确保每个顶点只被遍历一次,避免重复遍历。