问题
在函数LGraph BuildGraph()里面,83行,那个双层for循环第一层V=0进去了,输出值直接变了,不知道为什么。Vertex是下标,int类型
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MaxVertexNum 120 /*最大鳄鱼数量+中间island*/
typedef int Vertex; /*整数表顶点下标*/
typedef float WeightType; /*边的权值为浮点型*/
/*边的定义*/
typedef struct ENode *PtrToENode;
struct ENode{
Vertex V1,V2; /*有向边<V1,V2>*/
WeightType Weight; /*权重*/
};
typedef PtrToENode Edge;
/*邻接点的定义*/
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV; /*邻接点下标*/
WeightType Weight; /*边权重*/
PtrToAdjVNode Next; /*指向下一个邻接点的指针*/
};
typedef PtrToAdjVNode AdjNode;
/*顶点表头结点的定义*/
typedef struct VNode{
AdjNode FirstEdge; /*边表头指针*/
int X,Y; /*存顶点的数据*/
}AdjList[MaxVertexNum]; /*AdjList是邻接表类型*/
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /*顶点数*/
int Ne; /*边数*/
AdjList G; /*邻接表*/
};
typedef PtrToGNode LGraph; /*以邻接表方式存储的图的类型*/
int Visited[MaxVertexNum]; /*标记是否走过,为全局变量*/
void Reset()
{/*初始化visited*/
int i;
for( i=0; i<MaxVertexNum; i++ )
Visited[i] = 0;
}
LGraph CreateGraph( int VertexNum )
{/*初始化一个有VertexNum个顶点但没有边的图*/
Vertex V;
LGraph Graph;
Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0;
/*初始化邻接表头指针*/
for( V=0; V<Graph->Nv; V++ )
Graph->G[V].FirstEdge = NULL;
return Graph;
}
void InsertEdge( LGraph Graph, Edge E )
{
AdjNode NewNode;
/*插入边<V1,V2>*/
NewNode = (AdjNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Weight = E->Weight;
/*将V2插入V1的表头*/
NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode;
/*由于是无向图,因为既然可以跳过去,自然距离足够跳回来*/
NewNode = (AdjNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V1;
NewNode->Weight = E->Weight;
/*将V1插入V2的表头*/
NewNode->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode;
}
LGraph BuildGraph(int Nv,double D)
{
LGraph Graph;
Edge E = (Edge)malloc(sizeof(struct ENode));;
Vertex V,W;
int i,j;
double weight,deltx,delty;
Graph = CreateGraph(Nv); /*初始化有Nv个顶点但没有边的图*/
/*先输入起点数据,即中间岛屿*/
Graph->G[0].X = Graph->G[0].Y = 0;
/*输入顶点数据,即地址*/
for( V=1; V<Graph->Nv; V++ ){
scanf("%d%d",&(Graph->G[V].X),&(Graph->G[V].Y));
printf("V = %dBuildGraph = %d %d\n",V,Graph->G[V].X,Graph->G[V].Y);
}
/*接下来只需要将所有的边创造出来即可*/
printf("IsOK\n");
for( V=0; V<Nv; V++ ){
printf("V=%d\n");
for( W=V+1; W<Nv; W++ ){
deltx = Graph->G[V].X - Graph->G[W].X;
delty = Graph->G[V].Y - Graph->G[W].Y;
weight = sqrt(deltx*deltx + delty*delty);
if( V==0 ) weight-=7.5;
if( weight<=D ){
E->V1 = V;
E->V2 = W;
E->Weight = weight;
InsertEdge(Graph,E);
}
}
}
}
int BFSForOut(LGraph Graph,int D){
/*建立队列,存的是下标*/
Vertex Q[MaxVertexNum],V,W;
AdjNode LNode;
int front=-1,rear=-1;
/*flag表示当下是否可以出去,默认不能出去*/
int flag = 0;
/*第一个岛屿结点入队,标记*/
Visited[0] = 1;
Q[++rear] = 0;
/*当未遍历到可出去的结点并且队列不空时*/
while( !flag && front!=rear ){
/*出队*/
V = Q[(++front)%MaxVertexNum];
printf("Now Is In %d\n",V);
/*遍历当前结点*/
/*先进第一个结点*/
LNode = Graph->G[V].FirstEdge;
if(LNode->AdjV)
printf("OK?\n");
while(flag==0 && LNode){
printf("The next Node is %d\n",LNode->AdjV);
if(!Visited[LNode->AdjV]){
/*标记结点,入队*/
Visited[LNode->AdjV] = 1;
Q[(++rear)%MaxVertexNum] = LNode->AdjV;
/*判断是否可出去*/
if(50-fabs(Graph->G[LNode->AdjV].X)<D
|| 50-fabs(Graph->G[LNode->AdjV].Y)<D){
flag = 1;
}
}
LNode = LNode->Next;
}
}
return flag;
}
int main()
{
int N,D;
/*读入顶点和最大半径*/
scanf("%d%d",&N,&D);
/*建立图*/
/*输入的N仅仅是鳄鱼数,缺少中间Island*/
LGraph Graph = BuildGraph(N+1,D);
/*验证是否正确-----------------*/
int i;
for(i=0;i<=N;i++){
printf("%d %d\n",Graph->G[i].X,Graph->G[i].Y);
}
/*验证是否正确-----------------*/
/*开始遍历*/
printf("IsOk\n");
Reset();
if(BFSForOut(Graph,D)) printf("Yes\n");
else printf("No\n");
return 0;
}
输入
4 13
-12 12
12 12
-12 -12
12 -12