struct cell *search(int val)
連結リストを先頭から順に辿り,引数に指定した値valをもつセルへのポインタを返す.連結リスト中にvalをもつセルが複数存在する場合は,先頭に近いセルへのポインタを返す.また,連結リスト中にvalをもつセルが存在しない場合はNULLを返す.
という関数を追加するのですが何日もこの問題4日もこの問題で止まっています。自分でも考えてみたのですがなかなかできず困っています。助けてください。よろしくお願いします。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4/*連結リストのセルを定義する*/ 5struct cell{ 6 int value; /*このセルが持つデータ*/ 7 struct cell *next; /*次のセルを指すポインタ*/ 8}; 9 10/*連結リストの先頭を指すダミーセル.今回はvalueメンバの値を-1にする*/ 11struct cell gFront = {-1,NULL}; 12 13/*連結リストを表示する関数*/ 14void printList(void){ 15 struct cell *p; 16 17 /*セルを1つずつ辿りながらそのセルの内容を表示する*/ 18 printf("LIST[ "); 19 20 /*通常,ダミーセルは連結リストの一部には含めません. 21 *ダミーセルの次のセルが連結リストの先頭になります. */ 22 p = gFront.next; 23 while(p != NULL){ 24 printf("%d ", p->value); 25 p = p->next; 26 } 27 printf("]\n"); 28} 29 30struct cell *search(int val){ 31 struct cell *p; 32 int count=0; 33 34 p = gFront.next; 35 while(p != NULL){ 36 if(p->value <= val){ 37 count++; 38 if(count > 0){ 39 return p->next; 40 } 41 }else if(p->value >= val){ 42 count++; 43 if(count > 1){ 44 return gFront.next; 45 } 46 }else if(p->value <= gFront.value){ 47 return NULL; 48 } 49 p = p->next; 50 } 51 return 0; 52} 53 54int main(void){ 55 int a; 56 struct cell *p; 57 int val; 58 59 scanf("%d", &a); 60 while(a >= 0){ 61 62 p = malloc(sizeof(struct cell)); 63 if(p == NULL){ 64 fprintf(stderr, "エラー:maiioc失敗"); 65 exit(1); 66 } 67 p->value = a; 68 69 /****************************/ 70 /*連結リストの先頭に追加する*/ 71 /****************************/ 72 /*(1)まず,新しいセルが今の先頭のセルを指すようにする*/ 73 p->next = gFront.next; 74 75 /*(2)次に,ダミーセルが新しいセルを指すようにする*/ 76 gFront.next = p; 77 78 printList(); 79 scanf("%d", &a); 80 } 81 82 printf("入力を終了しました\n"); 83 84 printf("探す値を入力して下さい:"); 85 scanf("%d", &val); 86 87 p = search(val); 88 if(p == NULL){ 89 printf("%d以下をもつセルはありません\n", val); 90 }else{ 91 printf("%d以下をもつセルはあります\n", val); 92 printf("pが指すセルのvalueは%dです\n", p->value); 93 } 94 95 return 0; 96}
実行例は以下のようになります
40 30 20 10 -1 #逆順になることを見越して最初から逆順に入力
LIST[ 40 ]
LIST[ 30 40 ]
LIST[ 20 30 40 ]
LIST[ 10 20 30 40 ] #先頭に挿入していくので入力の逆順になる
入力を終了しました
探す値を入力してください: 30 #連結リストの中央付近にある値を指定
30をもつセルはあります
pが指すセルのvalueは30です
40 30 20 10 -1 #キーボード入力
LIST[ 40 ]
LIST[ 30 40 ]
LIST[ 20 30 40 ]
LIST[ 10 20 30 40 ]
入力を終了しました
探す値を入力してください: -1 #ダミーセルがもつ値を指定
-1をもつセルはありません #ダミーセルは連結リストではないので
#探索対象に含めていないことを確認する
40 30 20 10 -1 #キーボード入力
LIST[ 40 ]
LIST[ 30 40 ]
LIST[ 20 30 40 ]
LIST[ 10 20 30 40 ]
入力を終了しました
探す値を入力してください: 10 #連結リストの先頭セルの値を指定
10をもつセルはあります
pが指すセルのvalueは10です
40 30 20 10 -1 #キーボード入力
LIST[ 40 ]
LIST[ 30 40 ]
LIST[ 20 30 40 ]
LIST[ 10 20 30 40 ]
入力を終了しました
探す値を入力してください: 40 #連結リストの末尾セルの値を指定.
40をもつセルはあります
pが指すセルのvalueは40です
40 30 20 10 -1
LIST[ 40 ]
LIST[ 30 40 ]
LIST[ 20 30 40 ]
LIST[ 10 20 30 40 ]
入力を終了しました
探す値を入力してください: 25 #連結リストに存在しない値を指定
25をもつセルはありません
-1 #空の連結リストを作成
入力を終了しました
探す値を入力してください: 10
10をもつセルはありません
あなたの回答
tips
プレビュー