線形探索は、配列やリストを先頭から順番に要素を比較していき、目的の要素が見つかるまで続ける方法です。以下に、いくつかの線形探索の方法とそれに対応するコード例を示します。
- 配列の線形探索: 配列に対して線形探索を行う場合、以下のようなコードを記述します。
#include <stdio.h>
int linearSearch(int arr[], int n, int key) {
for (int i = 0; i < n; i++) {
if (arr[i] == key) {
return i; // 要素が見つかった場合、その要素のインデックスを返す
}
}
return -1; // 要素が見つからなかった場合は-1を返す
}
int main() {
int arr[] = {5, 9, 2, 8, 1};
int n = sizeof(arr) / sizeof(arr[0]);
int key = 8;
int result = linearSearch(arr, n, key);
if (result == -1) {
printf("要素が見つかりませんでした\n");
} else {
printf("要素が見つかりました。インデックス: %d\n", result);
}
return 0;
}
- リストの線形探索: リストに対して線形探索を行う場合、以下のようなコードを記述します。ここでは、単方向連結リストを例としています。
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
int linearSearch(struct Node* head, int key) {
struct Node* current = head;
int index = 0;
while (current != NULL) {
if (current->data == key) {
return index; // 要素が見つかった場合、その要素のインデックスを返す
}
current = current->next;
index++;
}
return -1; // 要素が見つからなかった場合は-1を返す
}
void insert(struct Node head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
struct Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
int main() {
struct Node* head = NULL;
insert(&head, 5);
insert(&head, 9);
insert(&head, 2);
insert(&head, 8);
insert(&head, 1);
int key = 8;
int result = linearSearch(head, key);
if (result == -1) {
printf("要素が見つかりませんでした\n");
} else {
printf("要素が見つかりました。インデックス: %d\n", result);
}
return 0;
}
以上がC言語における線形探索の方法とコード例です。線形探索はシンプルでわかりやすい手法ですが、要素数が多い場合には効率が悪くなることがあります。効率的な探索手法を選択する場合には、探索対象のデータ構造や要素の特性に応じて、二分探索やハッシュ探索などの他のアルゴリズムを検討することが重要です。