2016-11-21 105 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

它的工作!非常感谢你的帮助! –

相关问题