※ ChatGPTを利用し、要約された質問です(原文:C言語 線形探索)
C言語で連結リストの線形探索を行う方法
このQ&Aのポイント
C言語で連結リストを作成し、指定された値を線形探索する方法を紹介します。
連結リストはポインタを使用して実装され、値を格納するノードと次のノードへのポインタが連結されています。
線形探索では、連結リストを先頭から順番に辿り、目的の値と一致するノードを探します。見つかった場合はそのノードのポインタを返し、見つからなかった場合はNULLを返します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUFFERSIZE 256
struct LinkedListNode{
int data;
struct LinkedListNode *next;
};
struct LinkedList{
int node_num;
struct LinkedListNode *head;
};
LinkedList *LinkedListMake(char *filename)
{
FILE *fp;
LinkedList *list;
char buffer[MAXBUFFERSIZE];
/* ファイル有無のチェック */
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "No Such File : %s\n", filename);
exit (1);
}
list = LinkedListAlloc();
if (list == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}
while (fgets(buffer, MAXBUFFERSIZE, fp)) { /* ファイル終端に到達するまでループ */
buffer[strlen(buffer) - 1] = '\0'; /* 改行文字を削除 */
LinkedListDataAdd(list, atoi(buffer));
}
fclose(fp);
return (list);
}
LinkedList *LinkedListAlloc(void)
{
LinkedList *list;
list = (LinkedList *)malloc(sizeof(LinkedList));
if (list == NULL) { /* 領域確保失敗 */
return (NULL);
}
list->node_num = 0;
list->head = NULL;
return (list);
}
LinkedListNode *LinkedListDataAdd(LinkedList *list, int x)
{
LinkedListNode *ptr; /* 注目するノードへのポインタ */
LinkedListNode *prev;
LinkedListNode *new_node;
ptr = list->head;
prev = NULL;
while (ptr) { /* 終端ノードに到達するまでループ */
if (ptr->data < x) {
prev = ptr; /* 直前ノードの更新 */
ptr = ptr->next; /* 注目ノードの更新 */
} else if (ptr->data == x) { /* x は登録済み */
return (NULL);
} else { /* x を注目ノードの直前に追加 */
new_node = LinkedListNodeAlloc();
if (new_node == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}
new_node->data = x;
new_node->next = ptr; /* ポインタの付け替え(注目ノードの直前) */
if (prev != NULL) { /* 連結リストの先頭以降に追加 */
prev->next = new_node; /* ポインタの付け替え */
} else { /* 連結リストの先頭に追加 */
list->head = new_node;
}
list->node_num++; /* ノード総数の更新 */
return (new_node);
}
}
/* 終端ノードに到達 */
/* x を終端に追加 */
new_node = LinkedListNodeAlloc();
if (new_node == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}
new_node->data = x;
new_node->next = NULL; /* new_node は新たな終端ノード */
if (prev != NULL) { /* list は少なくともひとつのノードを有している */
prev->next = new_node; /* 更新前の終端ノードの直後が new_node となる */
} else { /* list は空(ノードがひとつも含まれない) */
list->head = new_node;
}
list->node_num++; /* ノード総数の更新 */
return (new_node);
}
LinkedList *LinkedListSearch(LinkedList *list, int x)←ここがわかりません★
{
for(i = 0; i < node_num)
???
int main(int argc, char *argv[])
{
int a, i, x;
printf("xの値を入力");
scanf("%d", &x);
LinkedListMake(argv[1]);
LinkedListSearch(list, x);
連結リストに格納されたint型データから目的の値を線形探索するプログラムをつくってます。
連結リスト作成関数まではできたので、あと連結リストにおいて目的の値を線形探索する関数LinkedListSearchをつくればだいたい完成だと思うのですが、関数LinkedListSearchの作り方がわかりません。
引数で連結リストのポインタと目的値をとって、目的値が存在すればそのノードのポインタ、存在しない場合はNULLを返すようにするつもりです。
わかる方、是非とも教えてください!
お願いいたします。
お礼
ありがとうございます!!