根据上一篇转载的文章写了写 出了很多问题;最主要的是队列问题, 队列的数据结构忘了。。
代码如下
#include <bits/stdc++.h>
using namespace std;
/*********** 队列的定义 ********/
typedef struct QNode
{
int data;
struct QNode *next;
}QNode;
typedef struct Queue
{
QNode *head, *tail;
int len;
}Queue;
/*********** 队列的操作 ********/
void InitQueue(Queue &Q)
{
Q.tail = Q.head = (QNode *)malloc(sizeof(QNode));
Q.tail->next = NULL;
Q.len = 0;
}
void EnQueue(Queue &Q, int e)
{
QNode *p = (QNode *)malloc(sizeof(QNode));//带有头结点
p->data = e;
Q.tail->next = p;
Q.tail = p;
Q.tail->next = NULL;
Q.len++;
}
void DeQueue(Queue &Q, int &e)
{
QNode *temp = Q.head->next;
e = temp->data;
Q.head->next = temp->next;
if(Q.tail == temp) Q.tail = Q.head;
Q.len--;
free(temp);
}
int visited[100];
/*********** 图的定义 ********/
typedef struct ArcNode
{
int adjvex;
// int weight;
struct ArcNode *next;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *first;
}VNode, AdjList[100];
typedef struct
{
AdjList vertices;//邻接表
int vexnum, arcnum;
}ALGraph;
/*********** 图的操作 ********/
void AddArcNode(ALGraph &G, int arc1, int arc2)
{
ArcNode *p, *q, *add;
add = (ArcNode *)malloc(sizeof(ArcNode));
add->adjvex = arc2;
add->next = NULL;
p = q = G.vertices[arc1].first;
if(p == NULL)
G.vertices[arc1].first = add;
else
{
if(p->adjvex > add->adjvex)
{
add->next = p;
G.vertices[arc1].first = add;
}
else
{
while(p->adjvex < add->adjvex && p->next != NULL)
{
q = p;
p = p->next;
}
if(p->next == NULL)
{
if(p->adjvex < add->adjvex)
p->next = add;
else
{
q->next = add;
add->next = p;
}
}
else
{
add->next = p;
q->next = add;
}
}
}
}
void CreatALGraph(ALGraph &AG)
{
printf("please input vexnum, arcnum\n");
scanf("%d %d", &AG.vexnum, &AG.arcnum);
for(int i = 0; i < AG.vexnum; ++i)
{
//scanf("%d", &AG.vertices[i].data);
AG.vertices[i].data = i;
AG.vertices[i].first = NULL;
}
for(int i = 0; i < AG.arcnum; ++i)
{
int a, b;
scanf("%d %d", &a, &b);
AddArcNode(AG, a, b);
AddArcNode(AG, b, a);//无向图
}
}
void Visit(int e)
{
printf(" %d", e);
}
int FirstAdjVex(ALGraph AG, int v)
{
if(AG.vertices[v].first == NULL)
return -1;
else
{
return AG.vertices[v].first->adjvex;
}
}
int NextAdjVex(ALGraph AG, int v, int w)
{
if(AG.vertices[v].first == NULL)
return -1;
else
{
ArcNode *p = AG.vertices[v].first;
while(p->adjvex != w)
{
p = p->next;
}
if(p->next == NULL)
return -1;
else
return p->next->adjvex;
}
}
void BFS(ALGraph AG, int v, void (*Visit)(int))
{
Visit(v);
visited[v] = 1;
Queue q;
InitQueue(q);
EnQueue(q, v);
while(q.len >= 1)
{
DeQueue(q, v);
for(int w = FirstAdjVex(AG, v); w >= 0; w = NextAdjVex(AG, v, w))
if(!visited[w])
{
Visit(w);
visited[w] = 1;
EnQueue(q, w);
}
}
}
void BFSTraverse(ALGraph AG, int v, void (*Visit)(int))
{
for(int i = 0; i < AG.vexnum; ++i)
visited[i] = 0;
BFS(AG, v, Visit);
for(int i = 0; i < AG.vexnum; ++i)
if(!visited[i])
BFS(AG, i, Visit);
}
void PrintfGraph(ALGraph AG)
{
for(int i = 0; i < AG.vexnum; ++i)
{
printf("%d 的临界点为 ", i);
if(AG.vertices[i].first != NULL)
{
ArcNode *temp = AG.vertices[i].first;
while(temp != NULL)
{
printf(" %d", temp->adjvex);
temp = temp->next;
}
}
else
printf("NO");
printf("\n");
}
}
int main()
{
ALGraph G;
int V;
CreatALGraph(G);
PrintfGraph(G);
scanf("%d", &V);
BFSTraverse(G, V, Visit);
}