哥特称号:程序出现了死循环,不知道该怎么办!

来源:百度文库 编辑:神马品牌网 时间:2024/05/03 05:21:22
无向图的深度遍历:
#include<iostream.h>
class graph
{
private:
struct Vexstruct
{
int flag;
int data;//指的是哪个顶点
};
int vexnum;
int arcnum;
Vexstruct vexarray[10];//定义顶点数组;
Vexstruct q;
int arcarray[20][20];//矩阵,顶点间有边则为1,不然则为0;
public:
graph()
{
cout<<"请问图的顶点数为多少?"<<endl;
cin>>vexnum;
cout<<"请问图的边数为多少?"<<endl;
cin>>arcnum;
q.flag=0;
q.data=0;
for(int i=0;i<vexnum;i++)
{
vexarray[i].data=0;
vexarray[i].flag=0;
for(int j=0;j<vexnum;j++)
arcarray[i][j]=0;
}
}
void BuildGraph()
{
for(int k=0;k<vexnum;k++)
{
vexarray[k].data=(k+1);
vexarray[k].flag=1;
}
cout<<"请依次输入图的边!"<<endl;
int m=0;
int i=0,j=0;
while(m<arcnum)
{
cout<<"哪两个顶点之间有边?"<<endl;
cin>>i;
cin>>j;
arcarray[i-1][j-1]=1;
arcarray[j-1][i-1]=1;
m++;
}
}
int Visited(Vexstruct vex)//检查顶点是否访问过
{
if(vex.flag)
return 0;
else
return 1;
}
void DFSTraverse()
{
for(int i=0;i<vexnum;i++)
{
if(Visited(vexarray[i])==0)
DFS(vexarray[i]);
}
}
void DFS(Vexstruct vex)
{
Visit(vex);
int i=1;
Vexstruct v;
for(v=Vexnext(vex,i);(v.data>=1)&&(v.data<=vexnum);v=Vexnext(vex,i))
{
if(Visited(v)==0)
DFS(v);
i++;
}
}
void Visit(Vexstruct vex)//访问顶点
{
cout<<vex.data<<endl;
vex.flag=0;
}
Vexstruct Vexnext(Vexstruct vex,int i)//查找vex顶点的第几个邻接点
{
int j=0,k=0;
while((j!=i)&&(k<=vexnum))
{
if(arcarray[vex.data-1][k])
j++;
k++;
}
if(j==i)
return vexarray[k-1];
else
return q;
}
};
void main()
{
graph g;
g.BuildGraph();
g.DFSTraverse();
}
问题出现在for循环那里!

你的Visit函数只是将形参的flag改变了,并没有改变vexarray[10]中元素的flag域,所以各点的flag域始终为1,即未被访问,所以死循环了。

将Visit函数里的vex.flag=0; 改成vexarray[vex.data-1].flag=0; 就行了。

把 报的问题 说清楚下啊

仔细看了下
怎么你那i的值有问题 一直是1呢?