В моем коде есть ошибка сегментации (сбрасывается ядром). Я не уверен, какая строка вызывает его, так как я довольно новичок в C. . Я пытаюсь реализовать здесь двоичное дерево поиска для каждой строки в файле (только для вставки и поиска). Каждая строка не должна превышать 1000 слов.Ошибка сегментации (сбрасывание сердечника) при реализации двоичного дерева
Вот мой код:
BST *bst_ins(BST *bst, char *key, void *value)
{
BST* temp = NULL;
int cmp = strcmp(bst->kvp.key, key);
if(bst == NULL)
{ /* This for null node */
temp = (BST*)malloc(sizeof(BST)); /* allocate the memory of struct for new node */
temp->left = NULL;
temp->right = NULL;
temp->kvp.key = key;
temp->kvp.value = value;
}
else if(cmp < 0) /* Current node less than input */
{
bst->right = bst_ins(bst->right,key,value);
}
else if(cmp > 0)
{
bst->left = bst_ins(bst->left,key,value);
}
return bst;
}
KVP *bst_get(BST *bst, char *key)
{
KVP* return_this;
if(bst!=NULL)
{
if(bst->kvp.key==key)
{
return return_this;
}
else if(strcmp(bst->kvp.key, key) < 0) /* Current node less than input */
{
return bst_get(bst->left, key);
}
else if(strcmp(bst->kvp.key,key) > 0)
{
return bst_get(bst->right,key);
}
}
return 0;
}
Ниже header.h
typedef struct {
char *key;
void *value;
} KVP;
typedef struct bst {
struct bst *left;
struct bst *right;
KVP kvp;
} BST;
Может кто-то пожалуйста, помогите мне понять, какая линия вызывает это? Спасибо.
EDIT:
SOLVED! НАКОНЕЦ: D
Вот основная функция.
int main()
{
char* str1=strdup("alokama");
char* str2=strdup("kokokoko");
BST *bst = NULL;
bst = bst_insert(bst,str1,NULL);
bst = bst_insert(bst,str2,NULL);
if(bst_get(bst,str1)){ printf ("yuhuu\n"); }
return 0;
}
'Я не уверен, какая линия вызывает' -> используйте' gdb' -> Будьте уверены. :-) –
Стандартное предупреждение: Пожалуйста, [не использовать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()' и family в 'C'. –
Когда вы проверяете строки для равенства, вы должны использовать 'strcmp' (как в ваших сравнениях с меньшим/большим, чем в сравнении), а не' == ', который будет проверять идентификацию. Вы также можете сэкономить много вызовов на 'strcmp', найдя результат сравнения один раз и сохранив его. –