ホームページ  >  に質問  >  本文

数据结构 - C++单链表删除指定元素的问题?

template <class T>
bool SingleList<T>::Delsame(T x)
{
    Node<T> *head;
    if(NULL == head) return head;
    Node<T> *p=head;
    Node<T> *first=NULL;
    while(NULL != p){
        if(p->element == x){
            Node<T> *del =p;
            p=p->link;
            if(NULL!= first){
                first->link=p;
            }else{
                head=p;
            }
            delete del;
        } else{
            first=p;
            p=p->link;
        }
    }
    return head;
}

代码如上,如 1 2 3 2 4 5 2
需要删除所有的2,
希望得到的结果是1 3 4 5
但目前得到的是1 2 3 4 5,
以及存在无法删除只有一个的元素、连续相同元素无法删除的问题,
如何修改可以将所有相同元素都删去呢?

黄舟黄舟2765日前700

全員に返信(2)返信します

  • 大家讲道理

    大家讲道理2017-04-17 15:31:02

    よくわからない質問がいくつかありますので、よく確認してください。

      先頭に
    1. headが定義されていますが、値を代入せずにNULLチェックを行います。 head には値が割り当てられていませんが、ランダムなアドレスなので NULL にはなりませんが、ここには明らかな論理エラーがあります

    2. first 言葉の意味からすると最初のノードを表しますが、前のノードを表すために使用しました ここではlastと改名した方がわかりやすいでしょうか?同様に、現在のポインター p の名前を current に変更することをお勧めします。

    3. if 条件では、del は後で使用するため、p を指すように p->next を定義する必要はないようです。接続を変更した後は、delete p だけを使用できます。 p = head または p = first->next を使用して現在のポインターを変更します。

    4. Delsamebool として定義されていますが、戻り値は head

    5. です

    その他のロジックでは今のところ問題は見つかっていませんので、まずは上記の問題を解析して対処してから効果を確認してみてはいかがでしょうか。

    JavaScript アルゴリズムのリファレンスを提供します

    JavaScript は主にアルゴリズムのアイデアを提供するものであり、C/C++ を学習したことがある人は理解できるはずです。次に、このアイデアに基づいて C++ で実装する方法を考えることができます。

    注:

    1. JavaScript はオブジェクトを参照します。この参照は C++ ポインターに似ていますが、C++ 参照とは異なります。

    2. JavaScript では delete が必要ないため、C++ プログラムに変更した後、適切な場所に delete を追加する必要があります。

    リーリー

    私が C++ コードを書かない理由の 1 つは、頭を使わせるためであり、もう 1 つの理由は、環境を設定するのが面倒だからです

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 15:31:02

    リーリー

    これは左側が閉じ、右側が開いている間隔であることに注意してください。つまり、[first, last) の範囲内のデータです。使用例:
    li.Remove(3)ここで: beginと最後は次のとおりです:
    リーリー

    効果は次のとおりです:

    返事
    0
  • キャンセル返事