我要飞=_= 2022-04-21 11:51 采纳率: 70.6%
浏览 51
已结题

C语言进入循环的值突变

问题

在函数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

结果

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 4月21日
    • 修改了问题 4月21日
    • 创建了问题 4月21日

    悬赏问题

    • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
    • ¥15 C语言使用vscode编码错误
    • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
    • ¥20 ensp怎么配置让PC1和PC2通讯上
    • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
    • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
    • ¥15 请各位帮我看看是哪里出了问题
    • ¥15 vs2019的js智能提示
    • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
    • ¥15 uniapp的h5项目写一个抽奖动画