当我现在使用整数时,这段代码完全正常工作 我想插入字符串,所以我改变了比较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);
}
答案 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。