6

いくつかの宿題で、リンクリストを使用してスタックを作成するという奇妙なエラーが発生しました。私のプログラムのすべての関数は、ノードがない最初のときや、いくつかを削除した後でも、完全に機能します。しかし、ノードを作成してすべて削除してゼロに戻すと、すべての関数がクラッシュします。私は問題を調査しようとしましたが、私が見つけた解決策は私がすでに持っているものとほとんど同じに見えるので、明らかに私が見ていない重要なものがあります。

これがノード削除機能です(これがすべての原因であると私が疑う機能です)

void remove(node** root)
{   
    node* temp = *root;
    node* previous = 0;
    if(*root)
    {
        while((*root)->next)
        {
            previous = *root;
            *root = (*root)->next;
        }
        delete *root;
        *root = temp;
        if(previous)
        {
            previous->next = 0;
        }
    }
    else
    {
        std::cout<<"cannot delete items from empty list\n";
    }
}

これがノード挿入機能です

void insert(node** root)
{
    node* temp = *root;
    if(*root)
    {
        while((*root)->next)
        {
            (*root) = (*root)->next;
        }
        (*root)->next = new node;
        (*root)->next->data = getnum();
        (*root)->next->next = 0;
        *root = temp;
    }
    else
    {
        (*root) = new node;
        (*root)->data = getnum();
        (*root)->next = 0;
    }

}

リンクしたコードのどこかに問題があると確信していますが、そうでない場合に備えて、完全な割り当てへのペーストビンを示しますhttp://pastebin.com/AWtG4qjD

4

1 に答える 1

4

remove実装が正しくありません。リストに1つの要素があるとします。この場合、実行後にtempは「存在しないメモリ」 を指します。delete *root; ただし、*root = temp; このようにして、rootが無効なノードを指すようにします。そして、これは後で奇妙な振る舞いを引き起こしますあなたの実装を正しくするための可能な方法は:

void remove(node** root)
{
    //TODO: your code here
    node* temp = *root;
    node* previous = 0;
    if(*root)
    {
        while((*root)->next)
        {
            previous = *root;
            *root = (*root)->next;
        }
        delete *root;
        if(previous)
        {
            *root = temp;
            previous->next = 0;
        }
        else {
            *root = NULL;
        }
    }
    else
    {
        std::cout<<"cannot delete items from empty list\n";
    }
}

ただし、ルートポインタを使用してリストを反復することはお勧めしません。* rootを変更する代わりに、イテレータを定義して、それで終わりを探します。

于 2012-07-20T18:03:36.830 に答える