3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データ構造とアルゴリズム Vol.3

Last updated at Posted at 2021-01-17

Vol.3: Doubly Linked List

この版ではDoubly Linked Listの必要性とその使い方について学びます。

Doubly Linked Listとは?

👌 Doubly Linked Listは頭(Head)と尻尾(Tail)を両方持っているという特徴があります。
👌 Doubly Linked Listの各ノードは、前ノードと後ろノードの情報を両方とも保存しています。

image.png

Doubly Linked Listの挿入プロセス

具現するイメージ
doublyLinkedList2.png

例)実行するコードの例

# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>

typedef struct {
  int data;
  struct Node *prev;
  struct Node *next;
} Node;

//前方でも後方でもアクセス可能
Node *head, *tail;

//挿入関数
void insert(int data){
  Node* node = (Node*)malloc(sizeOf(Node));
  node->data = data;
  Node* cur;
  //最初の元素
  cur = head->next;
  //我々が入れようとするデータより、見ているポインタノードのデータが小さいときに限って右に移動し続けるようにするため、昇順を維持可能
  while (cur->data < data && cur ! = tail) {
  cur = cur-> next;
  }
  Node* prev = cur->prev;
  prev->next = node;
  node->prev = prev;
  cur->prev = node;
  node->next = cur;

}

int main(void) {
  system("pause");
  return 0;
}

Doubly Linked Listの削除プロセス

具現するイメージ

image.png
deleteDoubly.png

例)実行するコードの例

上記のコードに以下のコードを追加

void removeFront() {
  Node* node = head->next;
  head->next = node->next;
  Node* next = node->next;
  next->prev = head;
  free(node);
}

void show() {
  Node* cur = head->next;
  while (cur != tail) {
    printf("%d", cur->data);
    cur = cur->next;
 }
}

完成したDoubly Linked Listの使用

例)実行するコードの例

上記のmainに以下のコードで修正

int main(void) {
  head = (Node*) malloc(sizeof(Node));
  tail = (Node*) malloc(sizeof(Node));
  head->next = tail;
  head->prev = head;
  tail->next = tail;
  tail->prev = head;
  insert(2);
  insert(1);
  insert(3);
  insert(9);
  insert(7);
  removeFront();
  show();
  system("pause");
  return 0;
}

🤔 結果は?
result-> 2 3 7 9

Doubly Linked List実装における注意点

❗上記のソースコードに加えて挿入および削除機能からの例外事項を処理する必要があります。
❗例として、これ以上削除する元素がないのに、削除する場合などをチェックする必要があります。

まとめ

👌 Doubly Linked Listは、各ノードが前ノード(Prev)と後ろノード(Next)の情報を保存しています。
👌 Doubly Linked Listを利用すると、リストの前から若しくは後ろからすべてアクセスできます。

📚参考講義:コンピューター工学専攻必須オールインワンパッケージOnline
👆 上記の講義はCとC++を言語を前提に説明しています。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?