Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 複雑なデータ構造 | 高度な構造体の活用
C構造体

複雑なデータ構造

メニューを表示するにはスワイプしてください

データ構造は、プログラマーがデータを効率的に保存、整理、管理するための手段。単純な配列や連続したストレージだけでは複雑な処理には不十分な場合が多く、そのためリスト、木構造、ハッシュテーブルなどの構造が利用される。

C言語では、構造体(struct)を使うことで、これら多様なデータ構造を柔軟に実装可能。

リンクリスト

リンクリストは、要素数が動的に変化する場合に有用。各ノードはデータと次のノードへのポインタを持つ。

linked+list

ノード構造体の例:

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)されるデータ構造であり、LIFOLast 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. 二分木において、自身の子ノードを持つノードは何と呼ばれますか?

question mark

配列と比較した場合、連結リストの主な利点は何ですか?

正しい答えを選んでください

question mark

二分木において、自身の子ノードを持つノードは何と呼ばれますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  4

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 4.  4
some-alt