2012-08-26 3 views
0

Я следую за книгой, Решение проблем & Дизайн программы на C, чтобы узнать C. В этой книге они предоставили все необходимые части для построения двоичного дерева поиска .... Но , Моя реализация не сработала. Вот часть вставки;Двоичный поиск Вставка дерева не работает

void 
add_to_t(tree_node_t *oldTreep, // input/output - binary search tree 
     tree_element_t ele)  // input - element to add 
{ 
    oldTreep = tree_insert(oldTreep, ele); 
} 
tree_node_t * tree_insert(tree_node_t *oldTreep, tree_element_t ele) 
{ 
    if(oldTreep == NULL){ 
     oldTreep = TYPED_ALLOC(tree_node_t); 
     strcpy(oldTreep->element.name, ele.name); 
     strcpy(oldTreep->element.sName, ele.sName); 
     oldTreep->element.seatClass = ele.seatClass; 
     oldTreep->leftp = NULL; 
     oldTreep->rightp = NULL; 
    } 
    else if (strcmp(oldTreep->element.name, ele.name)==0){ 
     /* duplicate key - no insertion */ 
    } 
    else if (strcmp(oldTreep->element.name, ele.name)>0){ 
     oldTreep->rightp = tree_insert(oldTreep->rightp, ele); 
    } 
    else 
    { 
     oldTreep->leftp = tree_insert(oldTreep->leftp, ele); 
    } 
    return(oldTreep); 

} 

My scan_passenger funvtion (я передаю элементу из результата этого вызова функции);

void scan_passenger(tree_element_t *pass) 
{ 
    char passName[10], passSname[10]; 
    int classNum; 
    printf("\nEnter the Name of passenger to add the binary search tree> "); 
    scanf("%s", passName); 
    printf("Enter the Surname of passenger to add the binary search tree> "); 
    scanf("%s", passSname); 
    printf("Enter the class number of passenger to add the binary search tree> "); 
    scanf("%d", &classNum); 
    strcpy(pass->name, passName); 
    strcpy(pass->sName, passSname); 
    pass->seatClass = classNum; 
} 

И мои typdefs и заголовки, если это необходимо;

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 
#define TYPED_ALLOC(type) (type *)malloc(sizeof (type)) 
typedef struct tree_element_s { 
    char name[10]; 
    char sName[10]; 
    int seatClass; 
}tree_element_t; 

typedef struct tree_node_s { 
    tree_element_t element; 
    struct tree_node_s *leftp, *rightp; 
}tree_node_t; 

Моя проблема заключается в том, что он не создает корень двоичного дерева поиска. Когда я пытаюсь добавить новый элемент в кучу, кажется, он создает новый узел. Когда я отслеживаю свой код, кажется, что каждый экземпляр этих функций возвращает NULL. Я пытаюсь сказать каждый раз, когда я вызываю tree_insert, он идет первым, если утверждение (Thinks root равно NULL) ... Извините за мой плохой английский. И я могу ошибаться, говоря о терминологии кодирования (это может быть потому, что я вернулся к изучению C из этой книги после отсутствия 1 года. Поэтому я могу их смешивать) Спасибо заранее.

ответ

0

В add_to_t вы обновляете oldTreep, но поскольку это локальная переменная, новое значение теряется, как только вы покидаете функцию.

Можно, например, вернуть новое значение oldTreep вызывающему абоненту, который обновляет его oldTreep с возвращаемым значением

tree_node_t 
add_to_t(tree_node_t *oldTreep, // input/output - binary search tree 
     tree_element_t ele)  // input - element to add 
{ 
    return tree_insert(oldTreep, ele); 
} 

... 

myRootOfTheTree = add_to_t (myRootOfTheTree, element); 

Другим решением является всегда один фиктивный элемент в дереве.

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