2

二分木を管理するための3つの関数があります:

static void insertion(Noeud* &top, Noeud *newNoeud)
{
    if(top == NULL)
        top = newNoeud;
    else if(newNoeud->nbr < top->nbr)
        insertion(top->left, newNoeud);
    else
        insertion(top->right, newNoeud);
}

static void affichage(Noeud* &top) //displaying
{
    if(top != NULL)
    {
        affichage(top->left);
        affichage(top->right);
        cout << "\n" << top->nbr;
    }
}

static Noeud* recherche(Noeud* &top, int nbr) //searching 
{
    while(top != NULL)
    {
        if(top->nbr == nbr)
            return(top);
        else if(nbr < top->nbr)
            top = top->left;
        else
            top = top->right;
    }
}

ただし、メモリスポットを読み取ろうとすると、アクセスに違反しているというエラーが表示され続けます。これは私のポインタに関係していると思いますが、それが何であるかは推測できません。

4

2 に答える 2

1

recherche変更すべきではtopない変更。

これもコンパイルされていますか?

static Noeud* recherche(Noeud* &top, int nbr) //searching 
{
    while(top != NULL)
    {
        if(top->nbr == nbr)
            return(top);
        else if(nbr < top->nbr)
            top = top->left;
        else
            top = top->right;
    }
}

これは常に値を返すとは限りません...

そのようなものでなければなりません:

static Noeud* recherche(Noeud* &top, int nbr) //searching 
{
    Noeud* it = top; //use a temporary pointer for the search.
    while(it != NULL)
    {
        if(it->nbr == nbr)
            return(it);
        else if(nbr < it->nbr)
            it = it->left;
        else
            it = it->right;
    }
    return it; //always return a value.
}
于 2012-11-25T06:02:49.737 に答える
1

検索方法により、最上位ノードがポイントしtopなくなります。

于 2012-11-25T05:11:41.377 に答える