線形リストにおける配列ベースの実装

1. 線形リストの基本概念

線形リストはデータ構造の基本要素であり、順序を持ったデータ要素の有限列です。主に配列で実装される「配列ベースリスト」とポインタで実装される「連結リスト」の2種類があります。

特徴:

  • 配列ベースリスト:ランダムアクセスが高速
  • 連結リスト:挿入・削除操作が容易

2. 配列による実装の構造

連続したメモリ領域を使って要素を格納します。各要素はインデックスによって直接アクセス可能です。

構造体定義

#define MAX_SIZE 100
typedef int ElementType;
typedef struct {
    ElementType elements[MAX_SIZE];
    int currentLength;
} ArrayBasedList;

要素取得処理

ElementType getElement(ArrayBasedList *list, int index) {
    if (!list || index < 0 || index >= list->currentLength) {
        return -1; // エラーコード
    }
    return list->elements[index];
}

要素挿入処理

int insertElement(ArrayBasedList *list, ElementType value, int index) {
    if (!list || index < 0 || index > list->currentLength) {
        return 0; // 失敗
    }
    
    // 最大容量を超えないように調整
    if (index > list->currentLength) {
        index = list->currentLength;
    }
    
    // 要素を後方にシフト
    for (int i = list->currentLength; i > index; i--) {
        list->elements[i] = list->elements[i-1];
    }
    
    list->elements[index] = value;
    list->currentLength++;
    return 1; // 成功
}

要素削除処理

ElementType deleteElement(ArrayBasedList *list, int index) {
    if (!list || index < 0 || index >= list->currentLength) {
        return -1; // エラーコード
    }
    
    ElementType removed = list->elements[index];
    
    // 要素を前方にシフト
    for (int i = index; i < list->currentLength-1; i++) {
        list->elements[i] = list->elements[i+1];
    }
    
    list->currentLength--;
    return removed;
}

その他の基本操作

int getListLength(ArrayBasedList *list) {
    return list->currentLength;
}

void printList(ArrayBasedList *list) {
    if (!list || list->currentLength == 0) {
        printf("リストは空です\n");
        return;
    }
    
    printf("リスト要素:");
    for (int i = 0; i < list->currentLength; i++) {
        printf("%d ", list->elements[i]);
    }
    printf("\n");
}

void clearList(ArrayBasedList *list) {
    list->currentLength = 0;
}

3. 配列ベースリストの特徴

メリット:

  • インデックスによる高速なアクセス(O(1))
  • ポインタのための追加メモリが不要

デメリット:

  • 挿入・削除時の要素移動(O(n))
  • 固定サイズのための柔軟性の低さ

タグ: C データ構造 配列操作 線形リスト

7月10日 17:49 投稿