データ構造(配列とリストとハッシュ)に関する世界観です。
まず、配列とリストとハッシュがある。
| データ構造 | 意味 |
|---|---|
| 配列 | メモリ上の連続した場所に作られる要素の集合。 添え字(インデックス)からアクセスする。 ベクター、ベクトルとも呼ばれる。 |
| 連結リスト | ポインタによって紐づけされた連結された要素の集合。 データ部とポインタ部に分けて管理する。 配列に比べて挿入や削除が容易だが探索に時間がかかる。 |
| ハッシュ | キーに対して値を設定する。 PHPでは連想配列、Pythonでは辞書、JavaScriptではオブジェクトと呼ばれる。 マップ、ハッシュテーブル、検索テーブルなどとも呼ばれる。 |
「シーケンス」という言葉が使われた時は、配列やそれ以外の順番に並んだデータ構造のことを指す。
また、リストには次のデータへのポインタをひとつだけ持っている「単方向リスト」の他に、前のデータへのポインタがある「双方向リスト」、環状に連結された「環状リスト」がある。
このほか、要素の順番が重要でない場合、集合(セット)などを用いることができる。集合は慣習的にビットフラグで表されるほか、順序の無関係な要素の集合を表すセット専用のデータ構造が提供されることもある。
2次元のデータ構造には、行列とテーブルがある。行列は要素がすべて同じ型になるが、テーブルは要素がそれぞれ違った型となる。テーブルは構造体による配列によって表現できる。
(Code Reading ~オープンソースから学ぶソフトウェア開発技法~ (プレミアムブックス版)を参考に執筆しました。)
Perl, PHP, Python, Rubyのような言語では、リストをスタックやキューとして使うことができる。スタックとキューを参照のこと。
2023.09.05
最近は、ハードウェアに近い処理や並列処理などを除いて、リンクリストは使われなくなりつつあります。理由はCPUやメモリにおいてキャッシュが効率的に行われづらいからです。以下の記事が参考になります。
2026.02.04
以下はGoogleのAIが書いた連結リストのサンプルコード。
#include <stdio.h>
#include <stdlib.h>
// ノードの構造体定義
struct Node {
int data; // データ
struct Node* next; // 次のノードへのポインタ
};
// リストの先頭からデータを表示する関数
void printList(struct Node* n) {
while (n != NULL) {
printf("%d -> ", n->data);
n = n->next;
}
printf("NULL\n");
}
int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
// 3つのノードをメモリに確保
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
// ノードに値を設定し、連結する
head->data = 10;
head->next = second; // 1番目と2番目を連結
second->data = 20;
second->next = third; // 2番目と3番目を連結
third->data = 30;
third->next = NULL; // 3番目は終端
// リストの表示
printf("Linked List: ");
printList(head);
// メモリの解放(実際には関数化して順次解放する)
free(head);
free(second);
free(third);
return 0;
}
2026.02.05
以下の書籍を参考に執筆しました。