0

this code was perfectly working when i was using integers now i want to insert strings so i changed the comparisons to strcomp and its not woorking any help appreciated link for the full code 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);
}
4

3 回答 3

1

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

root->data = strdup(x);

free摧毁你的树时,你还必须释放它。

于 2013-05-01T23:37:09.610 回答
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

作为一种改进,for 的内存请求data可以包含在mallocfor 节点中,从而(a)避免内存碎片,(b)避免(per-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
于 2013-05-01T23:37:17.043 回答
0

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

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

}*root=NULL,*temp;

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

于 2013-05-01T23:50:05.140 回答