2013-05-01 77 views
0

当我使用整数现在 我想插入字符串所以这段代码是可以正常使用的数据结构实现我改变了比较,STRCOMP及其不woorking任何帮助赞赏 链接的全部代码http://pastebin.com/6j1haZRF树木在C

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); 
} 
+1

当你说它已停止工作,你的意思是它运行,但没有得到你期望的结果?你有任何错误? – xagyg 2013-05-01 23:49:13

+0

它只为第一次插入而运行 – 2013-05-02 14:28:03

回答

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 
+0

好的一点,但是不要在可能来自malloc()而没有被清除或设置的内存上调用free()。有时malloc会给你零内存,大多数情况下不会。 – rivimey 2013-05-02 00:33:54

+0

将字符串存储在节点中的东西可以改进。有一个maxdatalen是如此的上个世纪!你可以做的是在一个块中的node + strlen的malloc内存,然后将该字符串存储在节点数据的末尾,然后将字符串指针设置为正确的位置。编码,肯定会测试你的C指针操纵的知识:-) – rivimey 2013-05-02 00:36:02

+0

@rivimey:谢谢你的意见。我已经更新了答案。 – Arun 2013-05-02 17:43:55

1

每当您拨打scanf时,您的输入缓冲区x都会发生变异。与整数大小写不同,分配将复制整数,在这种情况下,只分配指向您的字符串的指针。你应该这样分配的缓冲区的副本中的数据,甚至类似

root->data = strdup(x); 

您也将摧毁你的树时,与free释放这一点。

+0

非常感谢你 – 2013-05-02 14:28:46

0

解决方法是每次插入节点或声明以下结构时为node-> data string分配内存。

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

}*root=NULL,*temp; 

的问题是,你的内存只有一个字符串分配(CHAR一个[10]),第一时间你插入功能将工作,但你第二次被改写变量,并在插入函数你没有测试用例的字符串等于所以它返回null。