-5
void deleteElement(LinkedListElement<char> *&pending)
{
    if (pending->Next) {
        char value = pending->Next->Data;
        pending->Data = value;
        LinkedListElement<char> *temp = pending->Next;
        pending->Next = pending->Next->Next;
        delete temp;
    }else{
        delete pending;
        pending = NULL;
    }
}

LinkedListElement<char> *l1 = new LinkedListElement<char>('a');
LinkedListElement<char> *l2 = new LinkedListElement<char>('b');
LinkedListElement<char> *l3 = new LinkedListElement<char>('a');
LinkedListElement<char> *l4 = new LinkedListElement<char>('c');
l1->setNext(l2); l2->setNext(l3); l3->setNext(l4);

printLinkedList(l1);
deleteElement(l4);
printLinkedList(l1);

リンクされたリストが end の場合、C++ の単純なトリッキーな削除ノードは、else ステートメントにあるので、末尾自体を削除することができます。

ただし、2 つの出力関数は、常に abac を出力し、2 番目の方法では abac を出力します。参照 (&) を使用してパラメーターを渡すだけなので、l4 を削除する場合は、l3->Next を変更する必要はないと思います。l4 を NULL に変更すると、l3->Next が NULL になるからです。

私は使用しようとします

delete pending; pending=NULL;

なぜそれが機能しないのか、2つの印刷機能は常にabacを印刷します

4

1 に答える 1

0

あなたdelete l4は、しかしあなたは決して変更せず、まだデータを含むsメモリ(現在は削除されています)をl3指しています( 'c')l4

必要がある

l3->setNext(NULL);

リストから要素を削除します(もちろん削除する必要があります)

関数を使用するにはdeleteElement、リストを反復処理するように変更する必要があります (疑似コード)。

void deleteElement( Element head , Element toBeDeleted)
{
    //are we deleting head (the first element of the list?) 
    //yes then head should be nulled, and delete as normal

    current = head ; ancestor = head;

    //scan through list (current becomes current->next until no more)
    //until we find toBeDeleted
    //maintain ancestor as we go 

    //if found set ancestor->next to current->next
    //delete toBeDeleted
}
于 2012-12-06T21:46:06.710 に答える