c中的树数据结构实现

时间:2013-05-01 23:31:13

标签: c data-structures tree

当我现在使用整数时,这段代码完全正常工作 我想插入字符串,所以我改变了比较strcomp和它没有任何帮助赞赏 完整代码http://pastebin.com/6j1haZRF

的链接
struct node * insert(struct node *root, char x[])
{

if(!root)
{
    root=(struct node*)malloc(sizeof(struct node));
    root->data = x;
    root->left = NULL;
    root->right = NULL;
    return(root);
}
if((a=strcmp(root->data,x))>0){
    root->left = insert(root->left,x);
}
else
{
    if(strcmp(root->data,x)<0)
        root->right = insert(root->right,x);
}
return(root);
}

3 个答案:

答案 0 :(得分:1)

每次调用x时,您的输入缓冲区scanf都会发生变异。与整数情况不同,分配将复制整数,在这种情况下,分配仅复制指向字符串的指针。你应该将缓冲区的副本分配为数据,也许用

之类的东西
root->data = strdup(x);

在销毁树时,您还必须使用free释放此内容。

答案 1 :(得分:1)

对于以下结构

struct node{
    char * data;
    struct node *left;
    struct node *right;

} *root=NULL,*temp;

您必须单独为data分配内存。

以下不起作用

    root=(struct node*)malloc(sizeof(struct node));
    root->data = x;

解决方案策略1 :根据需要分配内存。即分配足够的内存来保存该节点的字符串。在这里,代码必须正确地管理node->data,即适当地分配和解除分配。

free( root->data );         // free previously allocated memory, if any
root->data = strdup( x );   // equivalent to malloc and memcpy

作为改进,data的内存请求可以包含在节点的malloc中,从而(a)避免内存碎片,(b)避免(每个malloc)开销,(c) )释放内存时避免额外的工作(free()节点将释放data的内存。

struct node {
    struct node *left;
    struct node *right;
    char * data;
};
size_t const xLen = strlen( x );
root = malloc( sizeof *root + xLen );
strncpy( root + sizeof root->left + sizeof root->right, x, xLen );

解决方案策略2 :让节点包含字符串所需的内存。这样,为字符串分别分配和释放没有麻烦。但是,另一方面,所有琴弦的上限都相同。 (这是一种权衡。)

char data[ MaxDataLen ];     // earlier, enum { MaxDataLen = 80 };
strncpy( root->data, x, MaxDataLen - 1 ); // copy chars 
root->data[ MaxDataLen - 1 ] = 0;         // NULL termination

答案 2 :(得分:0)

解决方案是每次插入节点或声明以下结构时为node-&gt;数据字符串分配内存。

struct node{
   char data[MaxData];
   struct node *left;
   struct node *right;

}*root=NULL,*temp;

问题是你的内存只分配了一个字符串(char a [10]),第一次你的插入函数工作,但第二次你覆盖变量a,并且在你的插入函数中你没有没有字符串等于的测试用例,所以它返回null。