我在使用二叉树工作时遇到了一些麻烦。一个奇怪的事情是当我尝试重复打印节点数据时,我得到一个seg错误。我把这当作一个红旗,表明我做错了什么。这是我用结构定义和插入函数制作的测试程序。有没有人注意到这个问题?
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdbool.h>
typedef struct Tnode{
char *name;
int value;
struct Tnode *left;
struct Tnode *right;
} Tnode;
Tnode *insert(Tnode *node, char *name, int value){
if(node==NULL){
Tnode *temp = malloc(sizeof(struct Tnode));
temp->name = strdup(name);
temp->value = value;
temp->left = NULL;
temp->right = NULL;
return temp;
}
else if(strcmp(name,node->name)<0)
{
node->left = insert(node->left, name, value);
}
else if(strcmp(name,node->name)>0)
{
node->right = insert(node->right, name, value);
}
else{
printf("something went wrong\n");
}
}
int main(){
Tnode *root = NULL;
root = insert(root,"george",11);
root = insert(root,"dick",12);
root = insert(root,"walter",13);
root = insert(root,"harry",13);
printf("%s\n",root->name);
root = insert(root,"zink",40);
printf("%s\n",root->name);
}
答案 0 :(得分:1)
&#34;插入&#34;除第一个if (node==NULL)
情况外,函数不返回任何内容。如果您没有从应该返回值的函数返回某些内容,则行为未定义;所以你可能会遇到一个段错误,或者它似乎在其他人的系统上运行等。
对于除if (node==NULL)
案例之外的所有情况,您可能希望return node;
。或者,您可能希望abort()
或exit()
或其中某些内容出现问题&#34;案件。你也应该{main} return 0;
,但这不会导致你的问题。
如果您在启用警告的情况下进行编译,则会更容易注意到这些问题。对于一些编译器(例如gcc),您可以通过将-Wall标志传递给编译器来打开许多警告。我建议总是至少使用-Wall编译。