数据结构 - C++单链表删除指定元素的问题?
黄舟
黄舟 2017-04-17 15:29:02
0
2
722
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,
以及存在无法删除只有一个的元素、连续相同元素无法删除的问题,
如何修改可以将所有相同元素都删去呢?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(2)
大家讲道理

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

    先頭に
  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
洪涛

リーリー

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

効果は次のとおりです:

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート