1

リンク リストの RemoveMid 関数に問題があります。コードは問題ないようで、構文エラーもありませんが、この関数を呼び出すと、プログラムが動作しなくなります。関数のロジックに問題があると思います。あなたがそれを修正するのを手伝ってくれることを願っています。これは RemoveMid 関数の実装です

template<typename T>
bool LinkedList<T>::RemoveMid(T& target)
{
    Node<T> *current = new Node<T>;
    bool found = false;
    current = start;
    while(current != NULL && !found)
    {
        if(current->next->info == target)
            found = true;
        if(!found)
            current = current->next;
    }
    if(found)
    {
        Node<T> *Ptr;
        Ptr = current->next;
        current = current->next;
        delete Ptr;
        return true;
    }
    else
        cout<<"target not found\n";

}
4

6 に答える 6

1

前のポインターがないため、これは単一リンクリスト (つまり、前方にのみ移動する) であると推測しています。それを念頭に置いて:

template<typename T> bool LinkedList<T>::Remove(T& target) // name changed as removing from anywhere in a linked list is effectively the same
{
    Node<T>* current = start; // your allocation caused a memory leak here
    Node<T>* previous = NULL;
    bool found = false;
    while(current != NULL)
    {
        if (current->info == target) // you should be looking at the current node, not the next node
        {
            found = true;
            break;
        }

        previous = current;
        current = current->next;
    }

    if (found)
    {
        if (previous == NULL)  // deleting head node
        {
            start = current->next;
        }
        else
        {
            previous->next = current->next;
        }

        delete current;
    }
    else
    {
        cout<<"target not found\n";
    }

    return found;
}
于 2013-08-26T14:43:24.793 に答える
1

これは、元の意図に似ているように見える適切に動作するバージョンです (私はそれをテストしていませんが、私の経験では、テストされていないソフトウェアにはバグがあります) (つまり、最初の要素を削除するときの特別なケースはありません):

template<typename T>
bool LinkedList<T>::RemoveMid(T const& target)
{
    for (Node<T> **current(&this->start); *current; current = &(*current)->next) {
        if ((*current)->info == target) {
            std::auto_ptr<Node<T>> tmp(*current);
            *current = (*current)->next;
            return true;
        }
    }
    std::cout<<"target not found\n";
    return false;
}
于 2013-08-26T15:23:06.487 に答える
0

このコードにはかなりの数の問題があります。

  1. nextここでリンクされたリストのノードをチェックしていますが、if(current->next->info == target)これはあなたのノードを見逃すでしょうstart
  2. ポインターに割り当ててから、2行後に再割り当てnew Node<T>します。currentstart
  3. その後、next2Ptr = current->next;行後にdelete Ptr.
  4. 削除しようとしているノードへのポインタを削除したいノードに割り当てるこれらの行の間にdelete!

おそらくもっと多くのエラーがありますが、これらすべてを修正することは良いスタートです。

于 2013-08-26T14:43:19.267 に答える
0

わからないところも多々あると思います

      Node<T> *current = new Node<T>;

とにかく現在のノードが開始に割り当てられるため、新しいノードを現在のノードに割り当てたいのはなぜですか?

第二に、

    if(current->next->info == target)
        found = true;

なぜcurrent->next代わりに使うのcurrentですか?また、無効current->nextになる NULL になる可能性がありますcurrent->next->info

ところで、STL が提供するリンク リストを使用しないのはなぜですか。

于 2013-08-26T14:47:21.977 に答える
0

あなたのエラーについて:この割り当てcurrent = current->next;current->next = current->next->next;current->nextcurrent->next->next

また、コードに問題がある可能性があります。current->next->infoノードがまだ見つからず、(current->nextが最後の要素を指す) である場合、まず第一に、プログラムがクラッシュします。この場合、明らかに違法です。後付けについてもいいかもしれませんNULLcurrentcurrent->next->inforeturn false;cout

于 2013-08-26T14:47:44.740 に答える
-2

これがあなたのコードのより良いバージョンです。より少ない変数とすべて。試してみて、今すぐ動作するかどうかを確認してください。:)

template<typename T>
bool LinkedList<T>::RemoveMid(T& target)
{
    Node<T> *current = new Node<T>;
    current = start;
    while(current != NULL)
    {
        if(current->next->info == target)
            break; //stops while loop = faster since the whole list doesnt have to be parsed once we found the target

        current = current->next;
    }

    if(current!=NULL)
    {
        current->next = current->next->next; //we "unlinked" target from the list and linked the rest of list instead
        return true;
    }
    else
        cout<<"target not found\n";
}
于 2013-08-26T14:53:55.973 に答える