【问题标题】:c: ignores return and function is repeatedc: 忽略返回,函数重复
【发布时间】:2015-06-04 08:57:10
【问题描述】:

我必须确定一个图是否连接。

我觉得我这里用了return的概念不好,但是问题是:当top= 0)。这发生了两次,而第二次, top 增加了一个(我不知道如何)然后到达“错误”。 感谢您的宝贵时间。

int connex(int **matrix, int *visited, Pila *p, int vertucsfuncion, int k,int x, int top){

    int u,j,c,f,contdos=0, cont=0;      
    x = PILA_top(*p);

    printf("\n%d\n",top);

    while (top > 0){

        cont = 0;           
        k++;

        for(u=0;u<k;u++){
            if(visited[u]!=x){
                contdos++;
            }
        }

        if (contdos==k){
            visited[contdos-1]=x;
            contdos = 0;
        }else{
            k--;
            contdos = 0;
        }       

        for(j=0;j<vertucsfuncion;j++){
            if(matrix[(x-1)][j]!=0){
                if(j!=(x-1)){
                    matrix[(x-1)][j]=matrix[(x-1)][j]-1;
                    matrix[j][(x-1)]=matrix[j][(x-1)]-1;
                    for(c=0;c<vertucsfuncion;c++){
                        for(f=0;f<vertucsfuncion;f++){
                            printf("|%d|",matrix[c][f]);
                        }
                        printf("\n");
                    }
                    printf("\n");
                    PILA_push(p,(j+1));
                    top++;
                    x = PILA_top(*p);
                    connex(matrix,visited,p,vertucsfuncion,k,x,top);
                }else{
                    matrix[(x-1)][j]=matrix[(x-1)][j]-1;
                    for(c=0;c<vertucsfuncion;c++){
                        for(f=0;f<vertucsfuncion;f++){
                            printf("|%d|",matrix[c][f]);
                        }
                        printf("\n");
                    }
                    PILA_push(p,(j+1));
                    top++;

                    connex(matrix,visited,p,vertucsfuncion,k,x,top);
                }               
            }               
            cont++;             
        }

        if(cont == vertucsfuncion ){                
            PILA_pop(p);
            top--;
            connex(matrix,visited,p,vertucsfuncion,k,x,top);
        }   
    }
    if(k==vertucsfuncion){
        printf("Is connex");
        return 0;
    }
    else{
        return 1;
    }

    return 0;
}

【问题讨论】:

  • 不明白你的问题。
  • 所以,我不知道,我什么时候到达返回0;功能继续。我想要的是在到达返回 0 时完成函数;
  • 强文本被“堆栈溢出”添加。
  • @moffeltje 是的,我知道,但是当 top=0;它忽略返回 0;并且(我不知道如何)增加一个变量 top...
  • 我已经做到了,但是太奇怪了。打印两次“is connex”后,top 增加 1,到第一次 printf“is connex”时,函数应该已经“停止”了。你觉得退货有什么问题吗? @moffeltje

标签: c function return


【解决方案1】:

在 connex 内部,在 while(top&gt;0) 循环中,您再次递归调用 connex:

top--;
connex(matrix,visited,p,vertucsfuncion,k,x,top);

当对 connex 的第二次调用调用 return 0 时,它只会从对 connex 的内部调用返回,而外部调用仍将继续进行 while(top &gt;0) 循环。

【讨论】:

  • 是的,我正在递归调用 connex,但是,你能解释一下你说什么吗?我没看懂。。对不起我的编程水平。
  • @user3129585 如果您有一个再次调用自身的函数,那么同一函数有两个实例。该函数的每个实例都有自己的变量集。如果您在调试器中运行程序并单步执行,您会看到这一点。
  • @user3129585 在实现像 connex 这样复杂的函数之前,您应该首先了解递归编程。您还应该检查在您的情况下是否确实需要递归。
  • 但是在“return 0”的时候,函数可能会停止,或者没有? Even 是否连接。
  • @user3129585 在return 0 时,connex 的当前实例正在返回/停止,调用该 connex 实例的函数再次获得控制权。如果调用函数是 connex 本身,则 connex 的前一个实例正在继续其工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2012-08-06
相关资源
最近更新 更多