C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の特定の位置にある二重リンクリストノードを削除します


このチュートリアルでは、指定された位置にある二重リンクリストのノードを削除する方法を学習します。

問題を解決するための手順を見てみましょう。

  • データ、前のポインタ、次のポインタを使用して構造体を記述します。

  • ノードを二重リンクリストに挿入する関数を記述します。

  • ダミーデータを使用して二重リンクリストを初期化します。

  • ノードを削除する位置を初期化します。

  • リンクリストを繰り返し処理し、指定された位置にあるノードを見つけて、ノードを削除します。

  • ノードを削除する関数を記述します。ノードを削除するときは、次の3つのケースを考慮してください。

    • ノードがヘッドノードの場合は、ヘッドを次のノードに移動します。

    • ノードが中間ノードの場合は、次のノードを前のノードにリンクします

    • ノードがエンドノードの場合は、前のノードリンクを削除します。

コードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *prev, *next;
};
void deleteNode(struct Node** head_ref, struct Node* del) {
   if (*head_ref == NULL || del == NULL) {
      return;
   }
   // head node
   if (*head_ref == del) {
      *head_ref = del->next;
   }
   // middle node
   if (del->next != NULL) {
      del->next->prev = del->prev;
   }
   // end node
   if (del->prev != NULL) {
      del->prev->next = del->next;
   }
   free(del);
}
void deleteNodeAtGivenPosition(struct Node** head_ref, int n) {
   if (*head_ref == NULL || n <= 0) {
      return;
   }
   struct Node* current = *head_ref;
   int i;
   for (int i = 1; current != NULL && i < n; i++) {
      current = current->next;
   }
   if (current == NULL) {
      return;
   }
   deleteNode(head_ref, current);
}
void insertNode(struct Node** head_ref, int new_data) {
   struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
   new_node->data = new_data;
   new_node->prev = NULL;
   new_node->next = (*head_ref);
   if ((*head_ref) != NULL) {
      (*head_ref)->prev = new_node;
   }
   (*head_ref) = new_node;
}
void printLinkedList(struct Node* head) {
   while (head != NULL) {
      cout << head->data << "->";
      head = head->next;
   }
}
int main() {
   struct Node* head = NULL;
   insertNode(&head, 5);
   insertNode(&head, 2);
   insertNode(&head, 4);
   insertNode(&head, 8);
   insertNode(&head, 10);
   cout << "Doubly linked list before deletion" << endl;
   printLinkedList(head);
   int n = 2;
   deleteNodeAtGivenPosition(&head, n);
   cout << "\nDoubly linked list after deletion" << endl;
   printLinkedList(head);
   return 0;
}

出力

上記のプログラムを実行すると、次の結果が得られます。

Doubly linked list before deletion
10->8->4->2->5->
Doubly linked list after deletion
10->4->2->5->

結論

チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。


  1. C++でマルチレベルリンクリストをフラット化する

    この問題では、マルチレベルのリンクリストが提供されます。私たちの仕事は、マルチレベルのリンクリストをフラット化するプログラムを作成することです。 平坦化操作は、リンクリストで最初に第1レベルのノードが発生し、次に第2レベルのノードが発生するように実行されます。 マルチレベルリンクリスト は多次元データ構造であり、リンクリストのすべてのノードに2つのリンクポインタがあります。1つは次のノードへのリンクで、もう1つは1つ以上のノードを持つ子リストへのリンクです。この子ポインタは、他のリストノードを指している場合とそうでない場合があります。 例 問題を理解するために例を見てみましょう

  2. 循環二重リンクリストを実装するC++プログラム

    データ構造では、リンクリストはデータ要素の線形コレクションです。リストの各要素またはノードは、データと次のノードへの参照の2つの項目で構成されます。最後のノードにはnullへの参照があります。リンクリストでは、エントリポイントはリストの先頭と呼ばれます。 Circular Doubly Linked Listでは、2つの連続する要素が前と次のポインターによってリンクまたは接続され、最後のノードは次のポインターによって最初のノードを指し、最初のノードも前のポインターによって最後のノードを指します。 アルゴリズム Begin    We shall create a clas