将节点添加到字符串的BST

时间:2013-02-17 21:50:33

标签: c segmentation-fault binary-search-tree

这是一项学校作业。当我尝试向BST添加新节点时,我遇到了seg错误。我认为这可能与我如何分配内存有关,但我无法弄清楚如何解决这个问题。

结构代码:

struct tnode {
  char* data;
  struct tnode* left;
  struct tnode* right;
};

typedef struct tnode Tnode;

添加节点功能:

Tnode* add_tnode(Tnode* current_tnode, char* value) {
  if (current_tnode == NULL) {
    malloc(sizeof(Tnode));
    current_tnode->data = value;
    current_tnode->left = NULL;
    current_tnode->right = NULL;
    return current_tnode;
      }
  else {
    if (strcmp(current_tnode->data, value) <= 0) {
      add_tnode(current_tnode->left, value);
      return current_tnode->left;
      }
    else {
      add_tnode(current_tnode->right, value);
      return current_tnode->right;
      }
  }
}

测试功能的主程序:

int main() {
  Tnode* new_node =  (Tnode*)malloc(sizeof(Tnode));
  char* data1 = "Hello";
  char* data2 = "Goodbye";
  char* data3 = "Hi";
  char* data4 = "Bye";
  char* data5 = "Hey";

  add_tnode(new_node, data1);
  add_tnode(new_node, data2);
  add_tnode(new_node, data3);
  add_tnode(new_node, data4);
  add_tnode(new_node, data5);

  return 0;
}    

这是我回溯分段错误时收到的错误:

#0  0x0000003458478350 in strcmp () from /lib64/libc.so.6
#1  0x00000000004005be in add_tnode (current_tnode=0x601010, 
    value=0x400708 "Hello") at tree.c:16
#2  0x0000000000400523 in main () at treetest.c:12

我在想当strcmp()试图找到存储在节点中的字符串时,它无法找到它。任何帮助或提示将非常感谢!

3 个答案:

答案 0 :(得分:1)

该行(add_tnode

malloc(sizeof(Tnode));

应该是

current_tnode = malloc(sizeof(Tnode));

您目前正在立即丢弃malloc的返回值,这意味着下一行代码会取消引用NULL指针,从而导致您的seg错误。

您还需要在new_node中明确初始化main的成员,或者使用calloc进行分配。并且,如Karoly Horvath所述,使用add_tnode

的返回值

答案 1 :(得分:1)

另一个问题:

add_tnode返回新分配节点的地址,但您从不使用它。

答案 2 :(得分:0)

您正在尝试访问“new_node”字段“data”,

但“new_node”未使用数据值初始化。

你需要将这些行移出if子句:

 current_tnode->data = value;
current_tnode->left = NULL;
current_tnode->right = NULL;
祝你好运。