学校の課題で以下の関数を追加する課題があったのですが「先頭に近いセルへのポインタを返す」のところがよく分からないのと多分こうじゃないかなと思ってやってみたのですが「制御が非 void 関数の終りに到達しました」とエラーが出てしまいます。このエラーはserch内ですどうしたら解決できるかご教授いただければ幸いです。
追加する関数↓
struct cell *search(int val);
連結リストを先頭から順に辿り,引数に指定した値valをもつセルへのポインタを返す.連結リスト中にvalをもつセルが複数存在する場合は,先頭に近いセルへのポインタを返す.また,連結リスト中にvalをもつセルが存在しない場合はNULLを返す.
改善が必要なプログラム↓
C
#include <stdio.h> #include <stdlib.h> /*連結リストのセルを定義する*/ struct cell{ int value; /*このセルが持つデータ*/ struct cell *next; /*次のセルを指すポインタ*/ }; /*連結リストの先頭を指すダミーセル.今回はvalueメンバの値を-1にする*/ struct cell gFront = {-1,NULL}; /*連結リストを表示する関数*/ void printList(void){ struct cell *p; /*セルを1つずつ辿りながらそのセルの内容を表示する*/ printf("LIST[ "); /*通常,ダミーセルは連結リストの一部には含めません. *ダミーセルの次のセルが連結リストの先頭になります. */ p = gFront.next; while(p != NULL){ printf("%d ", p->value); p = p->next; } printf("]\n"); } struct cell *search(int val){ struct cell *p; int count=0; p = gFront.next; while(p != NULL){ if(p->value <= val){ count++; return p->next; if(count == 0){ return NULL; } }else if(p->value >= val){ count++; if(count > 1){ return gFront.next; } p = p->next; } } return 0; } int main(void){ int a; struct cell *p; int val; scanf("%d", &a); while(a >= 0){ p = malloc(sizeof(struct cell)); if(p == NULL){ fprintf(stderr, "エラー:maiioc失敗"); exit(1); } p->value = a; /****************************/ /*連結リストの先頭に追加する*/ /****************************/ /*(1)まず,新しいセルが今の先頭のセルを指すようにする*/ p->next = gFront.next; /*(2)次に,ダミーセルが新しいセルを指すようにする*/ gFront.next = p; printList(); scanf("%d", &a); } printf("入力を終了しました\n"); printf("探す値を入力して下さい:"); scanf("%d", &val); p = search(val); if(p == NULL){ printf("%d以下をもつセルはありません\n", val); }else{ printf("%d以下をもつセルはあります\n", val); printf("pが指すセルのvalueは%dです\n", p->value); } return 0; }
>連結リスト中にvalをもつセルが存在しない場合はNULLを返す
はどこで処理していますか。
複数存在するときがcount>0だからセルに存在しないだからelseのところにreturn NULLと書いてみたのですが
while文に入らない場合どうなりますか。
whileは先頭から最後まで順に辿るのでwhile文に入らないことはないと思うのですが...
>制御が非 void 関数の終りに到達しました
の意味は実運用上ありえなくても非 void 関数でreturnしないケースがあると
いうことです。
制御が非 void 関数の終りに到達しましたのエラーが出るのは解決したのですが、先頭に近いセルへのポインタを返す方法が分かりません。
まだ回答がついていません
会員登録して回答してみよう