主题:[讨论]邻接表的广度优先搜索
今天写了一个基于邻接表的广度优先搜索算法,可是在我标注的地方老是出错,请高手赐教
#include<iostream>
using namespace std;
#define Max 10
typedef struct ArcNode//邻接表结构
{
int adjvertex; /*与弧相关联的另一个节点的编号*/
struct ArcNode *nextarc;/*下一个同弧尾的弧*/
}ArcNode;
typedef struct VertexNode/*头节点*/
{
int data;/*顶点数据*/
ArcNode *firstarc; /*以此顶点为弧尾的第一个弧(表节点)的指针*/
}VertexNode;
typedef struct
{
VertexNode vertex[Max];
int vexnum,arcnum;
}AdjList;
int locate(AdjList &G,int v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vertex[i].data==v)
return i;
}
}
void Create(AdjList &G)
{
int i,j,m,n;
int v1,v2;
ArcNode *p;
cout<<"请输入节点数和弧条数"<<endl;
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++)
{
cout<<"请输入节点序号(不能重复)"<<endl;
cin>>G.vertex[i].data;
G.vertex[i].firstarc=NULL;
}
for(i=0;i<G.arcnum;i++)
{
cout<<"请输入每条边的两个节点"<<endl;
cin>>v1;
m=locate(G,v1);
cin>>v2;
n=locate(G,v2);
if((m<0)||(n<0))
{
cout<<"你的输入有误,请重新输入"<<endl;//问题就出在这里,我每次输入两个顶点时,都会出现这句话
i--;
}
else
{
p=(ArcNode*)malloc(sizeof(ArcNode));/*此处建立的是无向图*/
p->adjvertex=n;
p->nextarc=G.vertex[m].firstarc;
G.vertex[m].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvertex=m;
p->nextarc=G.vertex[n].firstarc;
G.vertex[n].firstarc=p;
}
}
}
int Firstadjvex(AdjList &G,int v)
{
ArcNode *p=G.vertex[v].firstarc;
if(p!=NULL)
return p->adjvertex;
else
return -1;
}
int Nextadjvex(AdjList &G,int v,int w)
{
ArcNode *p=G.vertex[v].firstarc;
while(p!=NULL&&p->adjvertex!=w)
{
p=p->nextarc;
}
if(p!=NULL&&p->nextarc!=NULL)
return p->nextarc->adjvertex;
else
return -1;
}
int visited[10];
void BFS(AdjList &G,int v)
{
cout<<v<<endl;
visited[v]=1;
int w;
int rear=0,front=0;
int queue[10];
queue[rear]=v;
rear++;
while(rear!=front)
{
w=queue[front];
w=Firstadjvex(G,v);
while(w!=-1)
{
if(!visited[w])
{
cout<<w<<endl;
visited[w]=1;
queue[rear]=w;
rear++;
}
w=Nextadjvex(G,v,w);
}
}
}
void main()
{
int v;
AdjList G;
Create(G);
cout<<"请输入你想查找的第一个节点"<<endl;
cin>>v;
cout<<"广度优先搜索为"<<endl;
BFS(G,v);
}
#include<iostream>
using namespace std;
#define Max 10
typedef struct ArcNode//邻接表结构
{
int adjvertex; /*与弧相关联的另一个节点的编号*/
struct ArcNode *nextarc;/*下一个同弧尾的弧*/
}ArcNode;
typedef struct VertexNode/*头节点*/
{
int data;/*顶点数据*/
ArcNode *firstarc; /*以此顶点为弧尾的第一个弧(表节点)的指针*/
}VertexNode;
typedef struct
{
VertexNode vertex[Max];
int vexnum,arcnum;
}AdjList;
int locate(AdjList &G,int v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vertex[i].data==v)
return i;
}
}
void Create(AdjList &G)
{
int i,j,m,n;
int v1,v2;
ArcNode *p;
cout<<"请输入节点数和弧条数"<<endl;
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++)
{
cout<<"请输入节点序号(不能重复)"<<endl;
cin>>G.vertex[i].data;
G.vertex[i].firstarc=NULL;
}
for(i=0;i<G.arcnum;i++)
{
cout<<"请输入每条边的两个节点"<<endl;
cin>>v1;
m=locate(G,v1);
cin>>v2;
n=locate(G,v2);
if((m<0)||(n<0))
{
cout<<"你的输入有误,请重新输入"<<endl;//问题就出在这里,我每次输入两个顶点时,都会出现这句话
i--;
}
else
{
p=(ArcNode*)malloc(sizeof(ArcNode));/*此处建立的是无向图*/
p->adjvertex=n;
p->nextarc=G.vertex[m].firstarc;
G.vertex[m].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvertex=m;
p->nextarc=G.vertex[n].firstarc;
G.vertex[n].firstarc=p;
}
}
}
int Firstadjvex(AdjList &G,int v)
{
ArcNode *p=G.vertex[v].firstarc;
if(p!=NULL)
return p->adjvertex;
else
return -1;
}
int Nextadjvex(AdjList &G,int v,int w)
{
ArcNode *p=G.vertex[v].firstarc;
while(p!=NULL&&p->adjvertex!=w)
{
p=p->nextarc;
}
if(p!=NULL&&p->nextarc!=NULL)
return p->nextarc->adjvertex;
else
return -1;
}
int visited[10];
void BFS(AdjList &G,int v)
{
cout<<v<<endl;
visited[v]=1;
int w;
int rear=0,front=0;
int queue[10];
queue[rear]=v;
rear++;
while(rear!=front)
{
w=queue[front];
w=Firstadjvex(G,v);
while(w!=-1)
{
if(!visited[w])
{
cout<<w<<endl;
visited[w]=1;
queue[rear]=w;
rear++;
}
w=Nextadjvex(G,v,w);
}
}
}
void main()
{
int v;
AdjList G;
Create(G);
cout<<"请输入你想查找的第一个节点"<<endl;
cin>>v;
cout<<"广度优先搜索为"<<endl;
BFS(G,v);
}