我是C的新手,为了学习一些C基础知识,我自己开发了麻省理工学院实用C编程(麻省理工学院开放式课程主页)开放课件。
在赋值5中,我们应该实现一个小的二叉树库,用于分配、去分配、显示和遍历。
在测试以下实现时
#include <stdlib.h>
struct TreeNodeStruct {
int data ;
struct TreeNodeStruct *left, *right ;
} ;
typedef struct TreeNodeStruct TreeNode ;
TreeNode* talloc(int data)
{
/* variables */
TreeNode *p ;
/* logic */
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
/* return */
return p ;
}
TreeNode* addnode(TreeNode* root ,int data)
{
/* logic */
if(root == NULL) return talloc(data) ; // allocate node and return as new root
else if(data < root->data) root->left = addnode(root->left, data) ;
else root->right = addnode(root->right, data) ;
/* return */
return root ;
}在一个非常简单的测试用例中
printf("\nProblem 5.2\n") ;
tree = talloc(0) ;
printf("talloc(0): %s\n", tree == NULL ? "failure" : "success") ;
for(int i1 = 0, i2 = 10; ++i1 < i2 ; ) addnode(tree, i1) ;我遇到了一个分割错误11错误。这是测试用例的伪像还是实现中的错误?如果是,我做错什么了?
发布于 2015-03-19 15:40:43
malloc不初始化struct的成员。添加代码来完成这一任务。
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;如果不想使用这些行,也可以使用calloc。
p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;发布于 2015-03-19 15:39:51
您没有将left和right初始化为talloc()中的NULL。addnode()无法正确识别不存在的子树。
您应该注意到,malloc()不会在分配的内存空间中初始化任何内容。若要自动将其初始化为0,应使用calloc()。
p = calloc(1, sizeof(TreeNode));发布于 2015-03-19 15:40:01
在talloc中,您需要将左和右设置为空。
当您的代码遍历二叉树时,它将继续递归地调用自己,直到找到NULL为止,这表明您处于“叶子”状态。但是由于左和右都包含垃圾,所以它不会找到NULL。
https://stackoverflow.com/questions/29148851
复制相似问题