C - 二进制搜索树 - 按顺序打印不打印任何内容(仔细检查我的指针)

时间:2015-02-20 20:15:56

标签: c binary-tree

好的,所以我试图找到的问题是为什么当我调用print_inOrder()时,我没有得到任何打印回来的内容。我想要做的任务是按降序编写树算法(意思是左边的值越高,右边的值就越低)。我之前已经创建了一个创建了一个树的函数,所以我刚修改它并且它可以正常工作;但是这个赋值的签名与我的旧赋值不同,当我尝试更改指针时,我将其编译,但没有打印出来。因此,如果有人可以仔细检查我的更改,并解释我哪里出错了以及我需要如何修复它,这将是我的一天! ^。^

工作原始功能:

Tnode add_tnode(Tnode **current_tnode, char *value)
{
    if(!(*current_tnode))
    {
        *current_tnode = (Tnode*) malloc(sizeof(Tnode));
        (*current_tnode)->strValue = value;
         //initialize the children to null
        (*current_tnode)->left = NULL;
        (*current_tnode)->right = NULL;
    }

    //Greater values go to left
    else if(strcmp(value, (*current_tnode)->strValue) >= 0)
    {
      return add_tnode(&(*current_tnode)->left, value);
    }

    //Lesser values go to right
    else if(strcmp(value, (*current_tnode)->strValue) < 0)
    {
      return add_tnode(&(*current_tnode)->right, value);
    }
}

如何在main中调用它:

  Tnode *root;

  root = NULL;

  //Add some nodes with string values
  add_tnode(&root, "pie");
  add_tnode(&root, "hi");
  add_tnode(&root, "hi");
  add_tnode(&root, "l");
  add_tnode(&root, "leg");

  //Print nodes in descending order
  print_inOrder(root);

需要签名:

Tnode *add_tnode(Tnode *current_tnode, char* value)

我尝试修复:

Tnode *add_tnode(Tnode *current_tnode, char* value)
{
    if(!(current_tnode))
    {
        current_tnode = (Tnode*) malloc(sizeof(Tnode));
        (current_tnode)->strValue = value;
        /* initialize the children to null */
        (current_tnode)->left = NULL;
        (current_tnode)->right = NULL;
    }

    // Greater values go to left
    else if(strcmp(value, (current_tnode)->strValue) >= 0)
    {
      return add_tnode((current_tnode)->left, value);
    }

    // Lesser values go to right
    else if(strcmp(value, (current_tnode)->strValue) < 0)
    {
      return add_tnode((current_tnode)->right, value);
    }
}

如何在Main中调用它:

  Tnode *root;

  root = NULL;

  //Add some nodes with string values
  add_tnode(root, "pie");
  add_tnode(root, "hi");
  add_tnode(root, "hi");
  add_tnode(root, "l");
  add_tnode(root, "leg");

  //Print nodes in descending order
  print_inOrder(root);

这是print_inOrder()以防万一有人想看看它

void print_inOrder(Tnode *current_tnode)
{
    if (current_tnode)
    {
        print_inOrder(current_tnode->left);
        printf("%s\n",current_tnode->strValue);
        print_inOrder(current_tnode->right);
    }
}

当我通过gdb调试器运行并调用print函数时,它只会通过if语句并结束,我猜这意味着树根本没有创建或传递值不正确。如果有人能告诉我这个错误是什么,我会非常感激!

2 个答案:

答案 0 :(得分:1)

你的问题是你的第一个函数需要Tnode **,这是一个指向指针的指针,并修改它所指向的TNode *。你的第二个函数只接受指针,并修改传入的参数;调用者无法看到这些更改,因此没有任何内容添加到树中。

在执行任何操作之前,您应该分配并分配root节点,然后更改该函数,以便它修改TNode而不是指针。

答案 1 :(得分:0)

如果之前的作业有效,您只需更改打印功能,在探索左侧节点之前探索正确的节点。

void print_inOrder(Tnode *current_tnode)
{
    if (current_tnode)
    {
        print_inOrder(current_tnode->right);
        printf("%s\n",current_tnode->strValue);
        print_inOrder(current_tnode->left);
    }
}