Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
树数据结构在c语言中的实现_C_Data Structures_Tree - Fatal编程技术网

树数据结构在c语言中的实现

树数据结构在c语言中的实现,c,data-structures,tree,C,Data Structures,Tree,当我现在使用整数时,这段代码非常有效 我想插入字符串,所以我更改了与strcomp的比较,它没有任何帮助 完整代码的链接 struct node*insert(struct node*root,char x[]) { 如果(!root) { root=(结构节点*)malloc(sizeof(结构节点)); 根->数据=x; 根->左=空; root->right=NULL; 返回(根); } 如果((a=strcmp(根->数据,x))>0){ 根->左=插入(根->左,x); } 其他的 {

当我现在使用整数时,这段代码非常有效 我想插入字符串,所以我更改了与strcomp的比较,它没有任何帮助 完整代码的链接

struct node*insert(struct node*root,char x[])
{
如果(!root)
{
root=(结构节点*)malloc(sizeof(结构节点));
根->数据=x;
根->左=空;
root->right=NULL;
返回(根);
}
如果((a=strcmp(根->数据,x))>0){
根->左=插入(根->左,x);
}
其他的
{
if(strcmp(root->data,x)right=insert(root->right,x);
}
返回(根);
}

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

root->data = strdup(x);

销毁树时,您还必须使用
free
释放此文件。

用于以下结构

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

} *root=NULL,*temp;
您必须为
数据
单独分配内存

只是下面的方法是行不通的

    root=(struct node*)malloc(sizeof(struct node));
    root->data = x;
解决方案策略1:根据需要分配内存。即分配足够的内存来保存该节点的字符串。在此,代码必须正确管理
节点->数据,即适当分配和取消分配

free( root->data );         // free previously allocated memory, if any
root->data = strdup( x );   // equivalent to malloc and memcpy
作为改进,对
数据的内存请求可以包括在节点的
malloc
中,从而(a)避免内存碎片,(b)避免(每个malloc)开销,(c)避免释放内存时的额外工作(
free()
节点将释放
数据的内存)

解决方案策略2:让节点包含字符串所需的内存。这样,就不需要为字符串单独分配和取消分配内存。但是,另一方面,所有字符串的上限都相同。(这是一种折衷。)


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

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

}*root=NULL,*temp;

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

当您说它已停止工作时,是指它运行但没有得到预期的结果吗?是否有任何错误?它只在第一个ins中运行ertionGood点,但不要对可能来自malloc()的内存调用free()无需清除或设置。有时malloc会为您提供零内存,大多数情况下不会。在节点中存储字符串的功能可以得到改进。拥有maxdatalen是上个世纪的事!您可以改为将节点+strlen的malloc内存存储在一个块中,然后将字符串存储在节点数据末尾之外,然后设置字符串指针指向正确的位置。编码肯定会测试你对C指针操作的了解:-)@rividey:谢谢你的评论。我已经更新了答案。请注意,添加
free(root->data)
的建议导致o/p在
root=malloc(…
)之后立即执行此操作。毫不奇怪,尝试释放未初始化的指针会崩溃。更新您的答案以更清楚地了解何时使用
free
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 );
char data[ MaxDataLen ];     // earlier, enum { MaxDataLen = 80 };
strncpy( root->data, x, MaxDataLen - 1 ); // copy chars 
root->data[ MaxDataLen - 1 ] = 0;         // NULL termination
struct node{
   char data[MaxData];
   struct node *left;
   struct node *right;

}*root=NULL,*temp;