我正在处理一个二进制树,其中列出了数据,但我无法判断列表是否正在填充。代码运行正常但是当我尝试打印出树时,我的代码被冻结了。我相信一切都得到了恰当的指导,但很明显,逻辑中存在一个缺陷。
struct declarations
typedef struct lineList
{
int lineNum;
LIST *next;
}LIST;
typedef struct nodeTag{
char data[80];
LIST *lines;
struct nodeTag *left;
struct nodeTag *right;
} NODE;
声明并从主要传递给函数
NODE *root = NULL;
readFromFile(argv[1], root);
readfromfile(工作函数)然后调用insertword
insertWord(root, keyword, lineNum);
insertWord,addToList函数(问题区域)
NODE *allocateNode(char *data, int line)
{
NODE *root;
LIST *newNum;
if(!(root = (NODE *) malloc (sizeof(NODE))))
printf( "Fatal malloc error!\n" ), exit(1);
strcpy(root->data, data); //copy word
(root)->left = (root)->right = root->lines = NULL; //initialize
if (!(newNum =(LIST *) malloc (sizeof(LIST))))
printf( "Fatal malloc error!\n" ), exit(1);
newNum->lineNum = line;
root->lines = newNum;
return root;
}
/****************************************************************
ITERATIVE Insert
*/
NODE *insertWord(NODE *root, char *data, int line)
{
NODE *ptr_root = root;
printf("inserting %s\n", data);
if(root == NULL)
{
root = allocateNode(data, line);
return root;
}
while(ptr_root)
{
if (strcmp(data, ptr_root->data > 0))
{
if(ptr_root->right)
ptr_root = ptr_root->right; //traverse right
else
ptr_root->right = allocateNode(data, line);
}
else if (strcmp(data, ptr_root->data) < 0)
{
if(ptr_root->left) //traverse left
ptr_root = ptr_root->left;
else
ptr_root->left = allocateNode(data, line);
}
else
{
printf("Node already in the tree!\n");
addToList(ptr_root, line);
}
}
printf("5\n");
return root;
}
void printTreeInorder(NODE *root)//simple print, freeze on call to function
{
if(root)
{
printTreeInorder(root->left);
printf( "%s\n", root->data );
printTreeInorder(root->right);
}
return;
}
答案 0 :(得分:2)
让我们看一下insertWord()
:
ptr_root == NULL
。ptr_root
分配内存。ptr_root
。ptr_root
上执行内存泄漏。请注意,您需要保留新节点的父节点,并且需要将其左或右指针指向此新节点。
听起来你也懂得如何使用调试器。如果这是真的,您应该能够看到root
在对insertWord()
的调用之间没有变化。
在您通过尝试修复发布的代码中,您遗漏了一个关键字。让我们来看一个函数:
void foo(NODE *root) {
printf("before malloc: %p\n", root);
root = malloc(sizeof(NODE));
printf("after malloc: %p\n", root);
}
int main() {
NODE *root = NULL;
printf("before function: %p\n", root);
foo(root);
printf("after function: %p\n", root);
}
此代码将生成:
before function: 0x0
before malloc: 0x0
after malloc: 0x123ab129
after function: 0x0
请注意,对root
值的任何更改都不会传播到函数之外。但是,您更改为*root
的内容将会出现。