0

順序付きリンク リストの削除アルゴリズムを作成しようとしています。検索とトラバースはダウンしていると思いますが、削除するとうまくいきます。毎回クラッシュします。誰かがこれを修正するのを手伝ってくれますか?

クラスでListNode呼び出さheadれた構造体へのプライベート ポインターがあります。構造体には、、およびが含まれTestLLます。この関数は、削除するノードが見つかって削除された場合、または見つからなかった場合に戻ります。ListNodeint Keydouble dataValueListNode *nexttruefalse

私のコード:

bool TestLL::Delete(int Key)
{
    ListNode *back = NULL, *temp = head;
    //Search for the node to delete
    while ((temp != NULL) && (key != temp -> key))
        //advance the pointers
        back = temp;
        temp = temp->next;
    }

    //Check for node to delete not being found
    if (temp == NULL)
    {
        return false;
    }
    //Check for deleting the head of the list
    else if (back == NULL) // I'm very unsure of my else if and else
    {
        delete temp;
    }
    else // Remove node other than at the head
    {
        delete temp;
    }

    //deallocate memory used by the removed node
    free(temp);
    return true;
}
4

2 に答える 2

0

関数は、たとえば次のようになります(テストなし)

bool TestLL::Delete( int key )
{
    ListNode *prev = nullptr, *current = head;

    while ( current && !( current->key == key ) )
    {
        prev = current;
        current = current->next;
    }

    if ( !current ) return false;

    if ( prev ) prev->next = current->next;
    else head = head->next;

    delete current;

    return true;
}
于 2013-10-19T13:24:58.917 に答える
0

delete同じポインターでとの両方を使用freeすることは間違いなく問題です。

  • new以前にメモリを割り当てていた場合は、delete
  • を使用mallocした場合は、C++ を使用していることを思い出して、 に置き換えてくださいnew

の場合back == NULL、これは次のことを意味します。

  • headNULL(この場合は のみreturn false) または
  • 最初の要素は、削除したい要素です (この場合、要素 atheadをリストから削除する必要がありますhead = head->next; delete temp;) 。

の場合temp == NULL、これは要素が見つからなかったことを意味します - あなたは正しくreturn falseここにいます。

の場合temp != NULLは、次を削除する必要がありtempますback->next = temp->next; delete temp;

しかし、ポインターへのポインターを使用するだけの方が簡単に思えます。

bool TestLL::deleteKey(int key)
{
    ListNode **current = &head;
    while (*current != NULL)
    {
        if ((*current)->key == key)
        {
            ListNode *temp = *current;
            *current = (*current)->next;
            delete temp;
            return true;
        }
        current = &(*current)->next;
    }
    return false;
}
于 2013-10-19T16:52:06.417 に答える