2016-11-21 4 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; 

и заменить *root с root и root с &root в остальной части кода.

+0

Это сработало! Большое вам спасибо за вашу помощь! –

Смежные вопросы