以下程序旨在使用strcmp函數按字母順序在二進制搜索樹中存儲單詞。程序中詳述的問題是,函數的最後一部分函數的遞歸調用中沒有傳遞指針。遞歸函數在參數不爲NULL時傳遞NULL指針
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值,其中當不可這樣做的原因是,在分配第一個單詞之後,第二個單詞在右側或左側,取決於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);
}
我得到分段錯誤,我不知道爲什麼。
把檢查'點頭== NULL'(或只是'nod' :)之前你曾經試圖訪問其內容。你可能只是傾銷你的堆棧訪問。 –
請在您的編譯器中啓用警告,您使用'return;'在無效函數中使用,這是沒有意義的。同樣,你的拳頭'NULL'檢查將永遠不會匹配,如果'nod'在函數入口處爲null,則會在此之前進行段錯誤檢測。 – Mat
哦對不起,我已經重新編輯了。取得了回報;現在有意義 –