2016-11-21 102 views
0

我正在製作一個二叉搜索樹的電話簿程序。每當我嘗試輸入新數據時,都會發生分段錯誤。首先,我有一個類型定義結構名稱是phoneData.獲取分段錯誤。無法弄清楚爲什麼

typedef struct phoneData { 
    char name[NAME_LEN]; 
    char phoneNum[PHONE_LEN]; 
    struct phoneData *right, *left; 
} phoneData; 

void InputPhoneData() 
{ //phoneData *pData; 
    char name[NAME_LEN]; 
    char phoneNum[PHONE_LEN]; 

    /*if ((pData = (phoneData*)malloc(sizeof(phoneData))) == NULL) { 
     fprintf(stderr, "Memory Allocation failed\n"); 
     return; 
     }*/ 

    fputs("이름 입력: ", stdout); 
    if (fgetString(name, NAME_LEN, stdin) == 1) { 
     getchar(); 
     return; 
    } 

    fputs("전화번호 입력: ", stdout); 
    if (fgetString(phoneNum, PHONE_LEN, stdin) == 1) { 
     getchar(); 
     return; 
    } 

    insert_node(name, phoneNum); 
    numOfData++; 

    fputs("입력이 완료되었습니다.", stdout); 
    getchar(); 
} 

這就是我稱之爲輸入數據的功能。請不要介意韓語句子。在函數中,我調用另一個函數insert_node。這是插入二叉搜索樹節點的函數。

void insert_node(char name[], char phoneNum[]) 
{ 
    phoneData *p, *t; 
    phoneData *n; 

    t = *root; 
    p = NULL; 

    while (t != NULL) { 
     if (strcmp(name, t->name) == 0) 
      return; 

     p = t; 
     if (strcmp(name, p->name) < 0) 
      t = p->left; 
     else 
      t = p->right; 
    } 

    n = (phoneData*)malloc(sizeof(phoneData)); 
    if (n == NULL) 
     return; 

    strcpy(n->name, name); 
    strcpy(n->phoneNum, phoneNum); 
    n->left = n->right = NULL; 

    if (p != NULL) { 
     if (strcmp(p->name, name) < 0) 
      p->left = n; 
     else 
      p->right = n; 
    } 
    else 
     *root = n; 
} 

我還在想,哪一個是我得到分段錯誤的部分。我已經檢查了fgetString函數,它似乎沒問題。 InputPhoneData函數或insert_node函數有錯誤嗎?

+1

您是否嘗試過的valgrind?它可能會告訴你哪一行是問題。 –

+1

你設置't = * root;'; 「root」初始化在哪裏? (併爲此定義) – doctorlove

+0

順便說一下,變量'root'是一個全局變量,它是一個初始化爲NULL的雙指針。 (phoneData ** root = NULL;) –

回答

3

順便說一下,變量'root'是一個全局變量,它是一個初始化爲NULL的雙指針。 (phoneData ** root = NULL;)

這就是您的問題。 *root將取消引用NULL指針。

更改聲明:

phoneData *root = NULL; 

rootroot&root在你的代碼的其餘部分替代*root

+0

它的工作!非常感謝你的幫助! –

相關問題