1

完整代码http://pastebin.com/6bdVTyPt 我的树代码运行良好,直到我发现我需要验证它不是文本的 id 所以它必须是 90 和 129 的字符串插入函数字符串比较返回 8 尝试使用(atoi)并比较为整数不起作用任何帮助感谢
感谢您 继承人使用atoi而不是strcomp http://pastebin.com/yeuktyAF的插入函数仍然无法工作插入函数

   struct node * insert2(struct node *root, char x[],char id[])
 {
if(!root)
{
    root=(struct node*)malloc(sizeof(struct node));
    free( root->data );
    free( root->id );// free previously allocated memory, if any
    root->data = strdup( x ); // malloc and copy
    root->id=strdup(id);
    root->left = NULL;
    root->right = NULL;
    //   printf("1\n");
    return(root);
}
printf("string comp %d of %s of %s\n",strcmp(root->id,id),root->id,id);
if((strcmp(root->id,id))>0){
    root->left = insert(root->left,x,id);
    printf("go left\n");
}
else
{
    if(strcmp(root->id,id)<0){
        printf("go right\n");
        root->right = insert(root->right,x,id);}
}
return(root);
}
4

2 回答 2

1

线

root=(struct node*)malloc(sizeof(struct node));

为它分配内存root但不初始化它。这意味着以下几行

free( root->data );
free( root->id );

尝试释放未初始化(如此不可预测)的指针。这几乎肯定会崩溃。

由于您只是刚刚分配root,因此不可能有任何先前的值进入dataid释放。这意味着您可以将这三行简化为

root=malloc(sizeof(*root));
于 2013-05-15T08:34:04.007 回答
0

您不能使用 比较数字字符串strcmp()。您应该将您的 ID:s 存储为整数,如果它们是这样的话,那么您可以直接比较它们。

这还具有降低复杂性的好处,因为整数是固定大小的(假设unsigned long足够长),您不需要使用strdup().

另外,不要强制转换malloc()in C的返回值。

于 2013-05-15T08:58:15.177 回答