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);

}

私のscan_passenger関数(この関数呼び出しの結果からeleを渡します);

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;
}

そして、必要に応じて私のtypdefとヘッダー。

#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を呼び出すたびに、statement(rootがNULLだと思います)の場合に最初に言います...英語が下手でごめんなさい。また、コーディング用語の話を間違えるかもしれません(1年ぶりにその本からCの勉強に戻ったせいかもしれませんので、混ぜてしまうかもしれません)よろしくお願いします。

4

1 に答える 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);

もう 1 つの解決策は、ツリーに常に 1 つのダミー要素を含めることです。

于 2012-08-26T03:29:52.950 に答える