所讨论的功能:

struct node* findNext(struct node *root, struct node *ldr, int *p) {

  // Check if there are nodes in the tree.
  if(p == 0){
  if (root != NULL) {
    // correct organ/bt combo
    if(cmpOrgan(root, ldr) == 1){
        if (strcmp(root->organ.name, ldr->organ.name) != 0){
            if(cmpDates(root, ldr) == 1){
                p = 1;
                return root;
            }
            // The leader has been in longer then root
            if(cmpDates(root, ldr) == 2){
                return findNext(root->left, ldr, p);
            }
        }
        else{
            findNext(root->left, ldr, p);
            findNext(root->right, ldr, p);
            }
    }
    if(cmpOrgan(root, ldr) == 2){
        return findNext(root->left, ldr, p);
    }

    if(cmpOrgan(root, ldr) == 3){
        return findNext(root->right, ldr, p);
    }
  }
  }
  return NULL;
}

在这一部分中,我想从这个递归函数中分离出来:
if (strcmp(root->organ.name, ldr->organ.name) != 0){
    if(cmpDates(root, ldr) == 1){
        p = 1;
        return root;
    }

我尝试这样做的方法是扫描指向函数的全局指针,并在希望函数中断时将其更改为1。我的目标是在断点处返回当前根。这有可能吗?我正在初始化main中的指针,方法是:
int *p = 0;

当我试图用*p=1设置这些值时,程序将崩溃。我很确定我在指针上遗漏了一些基本的东西,但是我不知道是什么,因为我还是个新手。有人能帮我吗?有没有比这更简单的方法,我不知道?谢谢你事先的帮助。

最佳答案

当您说int *p = 0时,您正在创建一个空指针,如NULL == 0
当您稍后试图说*p = 1时,您取消了空指针的引用,导致您的程序崩溃。
更正确地说,如果您真的想使用指针,您应该为要存储在那里的int分配内存:

int *p = malloc(sizeof(int));
*p = 0;

然后你就有地方放你的智力了。
或者,不用费心将其创建为指针--只需说
int p = 0;

然后传递p的地址,使用&p,在这里您已经传递了p,将您的分配更改为*p = 1
三分之一的可能性是根本不通过p,而只是有一个全局变量p,它可以由函数在任何级别进行更改。这通常被认为是一种糟糕的编码风格,但它会完成你看起来想要做的事情。
最后,请注意,您不应该真的需要设置一个变量来脱离递归——当您返回时,它应该简单地继续返回您的函数调用堆栈的所有部分,通常可以对函数调用进行布局,以便不需要这样的标志变量。
特别是,对findNext进行两次递归调用,其返回值被简单地丢弃(在第一个else块中)。这些似乎并没有实际完成任何事情,您最好保留它们的返回值并使用它们来决定返回什么,或者,更好的是,只调用一个,检查其返回值,然后仅在必要时进行第二次调用。

10-04 18:25
查看更多