Я делаю программу телефонной книги с двоичным деревом поиска. Всякий раз, когда я пытаюсь ввести новые данные, возникает ошибка сегментации. Во-первых, у меня есть структура определения типа, имя которого 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
функция?
Вы пробовали Valgrind? Это может показать вам, на какой линии проблема. –
Вы устанавливаете 't = * root;'; где инициализируется «root»? (и определено в этом отношении) – doctorlove
И, кстати, переменная «root» является глобальной переменной, которая является двойным указателем, инициализированным как NULL. (phoneData ** root = NULL;) –