0

スタックを(リンクされたリストの形で)クリアする方法を見つけようとしています。リンクされたリストは私の得意分野ではありません。私はそれらをまったく理解していません。これが私のコードです。なぜそれが機能しないのか、誰かが光を当てることができますか? メインのスイッチを介してメソッドを呼び出そうとすると、無限ループに陥りすぎているようです。

void stack :: clearStack()
{
if (isEmpty()== true)
{
    cout << "\nThere are no elements in the stack. \n";
}

else 
{
    node *current = top;
    node *temp;
    while(current != NULL);
    {
        current = temp -> next;
        delete current;
        current = temp;
    }
}

}
4

4 に答える 4

2

そのコードにはいくつかの問題があります。1 つ目は、ループする前に初期化されていないポインター ( temp)を参照解除し、もう 1 つはポインターを逆参照することです (つまり、カーペットを自分の足元に引きずり出します)。deletenext

それは次のように簡単です

node* next;
for (node* current = top; current != nullptr; current = next)
{
    next = current->next;
    delete current;
}

ああ、終わったらクリアすることを忘れないでくださいtop

于 2013-10-26T19:39:10.960 に答える
0

を初期化していませんtemptempリストの最初のノードに設定する必要があります。ループ内で、ノードを循環し、それらを削除し続けます。

node *current = top;
node *temp = top; //    initialize temp to top
while(current != NULL);
{
    temp = temp -> next; // increase temp
    delete current;
    current = temp;
}
于 2013-10-26T19:39:25.430 に答える
0

これがあなたがやりたかったことだと思います:

node *current = top;
while(current != NULL);
{
    node *temp = current->next;
    delete current;
    current = temp;
}
top = null;
于 2013-10-26T19:40:01.237 に答える
0
if (isEmpty()== true)
{
    cout << "\nThere are no elements in the stack. \n";
}
else 
{
    node *current = top;
    node *temp;
    while(current != NULL);
    {
        current = temp -> next;
        delete current;
        current = temp;
    }
}

そのブロック全体を次のように置き換えることができます。

while (top != nullptr)
{
    unique_ptr<node> p(top);
    top = top->next;
}

リストがすでに空の場合、何も行われません。空でない場合unique_ptrは、現在のメモリ管理を制御しtop(ループ反復間で削除されます)、 を に移動しtopますnexttopがの場合NULL、すべてがクリアされ、topに設定されNULLます。

于 2013-10-26T19:46:47.957 に答える