2015-02-11 5 views
0

Я просто тренируюсь с деревьями и не могу понять, почему я продолжаю получать seg-ошибку, когда пытаюсь вставить vcard в свое двоичное дерево поиска ... Любая помощь? Благодарю. Я прикрепил функцию и некоторые тесты, которые я использовал для запуска функции. По какой-то причине он работает в одном случае (когда я сопоставляю ID2 с bst), но не работает, когда я пытаюсь сопоставить ID1 с bst.Сегментация Неисправность при печати ответа

Спасибо!

typedef struct { 
    char *cnet; 
    char *email; 
    char *fname; 
    char *lname; 
    char *tel; 
} vcard; 

typedef struct bst bst; 
struct bst { 
    vcard *c; 
    bst *lsub; 
    bst *rsub; 
}; 

int bst_insert(bst *t, vcard *c) { 

    if (t->c == NULL) { 
    fprintf (stderr, "Empty vcard"); 
    } 
    if (strcmp(c->cnet,t->c->cnet) == 0) { 
    return 0; 
    } 
    else if ((strcmp(c->cnet,t->c->cnet) < 0) && (t->lsub == NULL)) { 
    t->lsub->c = c; 
    return 1; 
    } 
    else if ((strcmp(c->cnet, t->c->cnet) < 0) && (t->lsub != NULL)) { 
    bst_insert(t->lsub, c); 
    } 
    else if ((strcmp(c->cnet, t->c->cnet) > 0) && (t->rsub == NULL)) { 
    t->rsub->c = c; 
    return 1; 
    } 
    else if ((strcmp(c->cnet, t->c->cnet) > 0) && (t->rsub != NULL)) { 
    bst_insert(t->rsub, c); 
    } 

} 

int main() { 
    vcard NewID; 
    NewID.cnet = "leeholim"; 
    NewID.email = "[email protected]"; 
    NewID.fname = "leeho"; 
    NewID.lname = "lim"; 
    NewID.tel = "555-555-5555"; 


    vcard NewID2; 
    NewID2.cnet = "donalfonsodailey"; 
    NewID2.email = "[email protected]"; 
    NewID2.fname = "My name's donny"; 
    NewID2.lname = "dailey"; 
    NewID2.tel = "212-323-1234"; 


    bst ID; 
    ID.c = &NewID; 
    ID.lsub = NULL; 
    ID.rsub = NULL; 

    printf("%s\n", Poop->c->fname); 
    printf("%d\n", bst_insert(&ID, &NewID2)); 
} 
+0

опубликуйте достаточно кода, который кто-то может скомпилировать и запустить и увидеть тот же результат. [См. Здесь] (http://stackoverflow.com/help/mcve) для получения дополнительной информации –

+0

Ну что ж, вы добавили «int main() {}" –

+0

Где находится 'bst_singleton()'? – timrau

ответ

1
else if ((strcmp(c->cnet,t->c->cnet) < 0) && (t->lsub == NULL)) { 
    t->lsub->c = c; 
    return 1; 
} 

Определенно не следует назначать t->lsub->c когда t->lsub == NULL.

+0

Спасибо! Могу ли я назначить t-> lsub-> lsub и t-> lsub-> rsub равными NULL и заставить их уйти? –

+0

@LeehoLim Нет. Вы не должны разыскивать указатель NULL, не говоря уже о его членах. – timrau

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

  • Нет связанных вопросов^_^