1

挿入、循環リンクリストでの検索は完了しましたが、削除のためにコンパイラエラーが発生しています...

以下は、ノードの私の構造です。

 struct node
 {
     int               p_data;
     struct node*   p_next;

     node(node* head, int data)
     {
           p_next = head;
           p_data = data;
     }

     explicit node(int data)
      {
           p_next = nullptr;
           p_data = data;
      }
 };




 node* remove_circular(node* head, node* target)
 {
      if (head == target->p_next)
      {
           delete head;
           return nullptr;
      }

      auto next_pointer = target->p_next;
      target->p_data = next_pointer->p_data;
      target->p_next = next_pointer->p_next;

      delete target->p_next;
      return target;
 }

そしてメイン関数で私が呼び出す

 head = remove_circular(head, head);
 head = remove_circular(head, temp);

これは、 head 要素と temp が指す別の要素を削除することです。しかし、私はエラーが発生しています

循環リストから1つの要素を削除するアイデアはありますか??

target->p_next; を削除するように変更しました。しかし、今ではリスト内のすべてを削除します。何か案が???

4

3 に答える 3

4

これは、循環リンクリストがどのように機能するかです:


連結リストの例


各ノードは次の行を指し、リストの末尾はヘッダー ノードを指します。circular linked listこれが aと aの違いですregular linked list(上記の場合、37はターミネータを指しますnull)。

オブジェクトが 1 つしかないリストの場合、次のようになります。


ノードのみの状況


したがって、ご覧のとおり、どこにも指しているオブジェクトはありませんが、コンストラクターnullを使用してコードで発生します(これは、私が書いた場合に実行されます)。explicitnode n = node(12)

このリンクを見て、アルゴリズムがどのように見えるべきかをよりよく理解することをお勧めします。

于 2013-08-21T18:55:21.137 に答える