複雑なデータ構造
メニューを表示するにはスワイプしてください
データ構造は、プログラマーがデータを効率的に保存、整理、管理するための手段。単純な配列や連続したストレージだけでは複雑な処理には不十分な場合が多く、そのためリスト、木構造、ハッシュテーブルなどの構造が利用される。
C言語では、構造体(struct)を使うことで、これら多様なデータ構造を柔軟に実装可能。
リンクリスト
リンクリストは、要素数が動的に変化する場合に有用。各ノードはデータと次のノードへのポインタを持つ。
ノード構造体の例:
struct Node {
int data; // data in node
struct Node* next; // pointer to next node
};
各ノードは data フィールドと next ポインタを持つ。この構造により、配列とは異なり、リスト内の任意の場所で要素の追加や削除が可能となり、全体の構造を再編成する必要がない。
ハッシュテーブル
ハッシュテーブルは、キーを使ってデータを高速に取得するためのデータ構造。ハッシュ関数がキーを配列のインデックスに変換し、その位置に値が格納される。
ハッシュテーブルの実装例:
struct Node {
char* key; // key
int value; // value
struct Node* next; // pointer to next node
};
struct HashTable {
struct Node** table; // array of node pointers
int size; // table size
};
unsigned int hashFunction(char* key, int size) {
unsigned int hash = 0;
while (*key) {
hash += *key++;
}
return hash % size;
}
ハッシュテーブルの各要素は、キーと値を含む連結リストノード。 ハッシュ関数はキーを配列インデックスに変換し、大規模なデータセットでも高速な検索を実現。
木構造
木構造は階層データ、高速な検索、挿入、削除に有用。
二分木は、各ノードが最大2つの子(左と右)を持つ木構造。
二分木の実装例:
struct node
{
int data;
struct node* left;
struct node* right;
};
ノードは、自身の子ノードの親であると同時に、親ノードの子でもある場合があります。二分木は「左-右」の論理構造により、効率的なデータ整理と高速な検索を実現します。
スタック
ネットワークや関係性のモデル化に使用。
スタックは、要素が追加(push)および削除(pop)されるデータ構造であり、LIFO(Last In, First Out、後入れ先出し)原則に従う。
配列を用いたスタックの例:
// Stack structure
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
MAX_SIZE - スタックが保持できる要素の最大数。
// Push an element onto the stack
void push(Stack *stack, int value) {
stack->data[++stack->top] = value; // Increment top and add the element
printf("Element %d pushed onto the stack\n", value);
}
// Pop an element from the stack
int pop(Stack *stack) {
int value = stack->data[stack->top--]; // Retrieve the element and decrement top
printf("Element %d popped from the stack\n", value);
return value;
}
要素はスタックの先頭(top)に追加されます。スタックは要素の追加と削除が高速で、最後に追加された要素が最初に取り出されます。
C言語の構造体を使用することで、配列、連結リスト、ハッシュテーブル、木構造、スタックなど、柔軟で強力なデータ構造を作成可能です。各構造体は特定の用途に最適化されており、プログラムをより整理され効率的にします。
1. 配列と比較した場合、連結リストの主な利点は何ですか?
2. 二分木において、自身の子ノードを持つノードは何と呼ばれますか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください