Следующая программа предназначена для хранения слов в алфавитном порядке в дереве двоичного поиска с использованием функции strcmp.Проблема, подробно описанная в программе, заключается в том, что при рекурсивном вызове функции в последней части функции не передается указатель.
typedef struct NodT{
char word[30];
struct NodT *left, *right;
} NOD;
void reset_field(NOD *nod){
int i;
for(i=0; i<30; i++){
nod->word[i]='\0';
}
}
void enter_recursively(NOD *nod, char *word){
if(nod==NULL){
nod= (NOD *) malloc(sizeof(NOD));
nod->left=NULL;
nod->right=NULL;
reset_field(nod);
strcpy(nod->word, word);
return;
}
if(nod->word[0]=='\0'){
strcpy(nod->word, word);
return;
}
if(strcmp(nod->word, word)==0) return;
if(strcmp(nod->word, word)<0){
enter_recursively(nod->right, word);//the problem seems to be here
printf("right\n");
}
else{
enter_recursively(nod->left, word);//...and here
printf("left\n");
}
//the NULL pointer is being sent over, which is peculiar
}
Дело в том, что, когда я передаю указатели (оставленныесправа от структуры к рекурсивной функции в условиях if-else она принимает значение NULL с другой стороны, чего не должно быть, поскольку они не равны NULL после выделения первого слова в корне и второго ввправо или влево в зависимости от strcmp, расположение при использовании malloc для создания нового пространства для хранения слова.
ОБНОВЛЕНИЕ: новый скрипт с использованием двойных указателей:
typedef struct NodT{
int key;
char word[30];
struct NodT *left, *right;
} NOD;
void enter_recursively(NOD **nod, char *word){
printf("N: %p\n", nod);
printf("NL: %p\n", (**nod).left);
printf("NR: %p\n", (**nod).right);
if(nod==NULL){
nod=malloc(sizeof(NOD));
(**nod).left=NULL;
(**nod).right=NULL;
strcpy((**nod).word, word);
return;
}
if((**nod).word[0]=='\0'){
strcpy((**nod).word, word);
return;
}
if(strcmp((**nod).word, word)==0) return;
if(strcmp((**nod).word, word)<0){
enter_recursively((**nod).right, word);
}
else{
enter_recursively((**nod).left, word);
}
Я получаю сегментациювина, и я не знаю почему.