質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Q&A

0回答

281閲覧

先頭に近いセルへのポインタを返す方法

sakippe

総合スコア21

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

0グッド

0クリップ

投稿2022/06/25 10:00

編集2022/06/26 05:30

学校の課題で以下の関数を追加する課題があったのですが「先頭に近いセルへのポインタを返す」のところがよく分からないのと多分こうじゃないかなと思ってやってみたのですが「制御が非 void 関数の終りに到達しました」とエラーが出てしまいます。このエラーはserch内ですどうしたら解決できるかご教授いただければ幸いです。

追加する関数↓
struct cell *search(int val);
連結リストを先頭から順に辿り,引数に指定した値valをもつセルへのポインタを返す.連結リスト中にvalをもつセルが複数存在する場合は,先頭に近いセルへのポインタを返す.また,連結リスト中にvalをもつセルが存在しない場合はNULLを返す.

改善が必要なプログラム↓

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 return p->next; 39 if(count == 0){ 40 return NULL; 41 } 42 }else if(p->value >= val){ 43 count++; 44 if(count > 1){ 45 return gFront.next; 46 } 47 p = p->next; 48 } 49 } 50 return 0; 51} 52 53int main(void){ 54 int a; 55 struct cell *p; 56 int val; 57 58 scanf("%d", &a); 59 while(a >= 0){ 60 61 p = malloc(sizeof(struct cell)); 62 if(p == NULL){ 63 fprintf(stderr, "エラー:maiioc失敗"); 64 exit(1); 65 } 66 p->value = a; 67 68 /****************************/ 69 /*連結リストの先頭に追加する*/ 70 /****************************/ 71 /*(1)まず,新しいセルが今の先頭のセルを指すようにする*/ 72 p->next = gFront.next; 73 74 /*(2)次に,ダミーセルが新しいセルを指すようにする*/ 75 gFront.next = p; 76 77 printList(); 78 scanf("%d", &a); 79 } 80 81 printf("入力を終了しました\n"); 82 83 printf("探す値を入力して下さい:"); 84 scanf("%d", &val); 85 86 p = search(val); 87 if(p == NULL){ 88 printf("%d以下をもつセルはありません\n", val); 89 }else{ 90 printf("%d以下をもつセルはあります\n", val); 91 printf("pが指すセルのvalueは%dです\n", p->value); 92 } 93 94 return 0; 95}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2022/06/25 10:32

>連結リスト中にvalをもつセルが存在しない場合はNULLを返す はどこで処理していますか。
sakippe

2022/06/25 10:55

複数存在するときがcount>0だからセルに存在しないだからelseのところにreturn NULLと書いてみたのですが
1T2R3M4

2022/06/26 03:40

while文に入らない場合どうなりますか。
sakippe

2022/06/26 03:59

whileは先頭から最後まで順に辿るのでwhile文に入らないことはないと思うのですが...
1T2R3M4

2022/06/26 04:27

>制御が非 void 関数の終りに到達しました の意味は実運用上ありえなくても非 void 関数でreturnしないケースがあると いうことです。
sakippe

2022/06/26 05:33

制御が非 void 関数の終りに到達しましたのエラーが出るのは解決したのですが、先頭に近いセルへのポインタを返す方法が分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問