質問: NULL) break; } ``` ### 試したこと 当初は配列で考えたのですが、処理後配列の長さが変わるということで可変型が言いと思い、構造体にしました。 このコードで 0123456789 と入力すると 01236 となるため、まだ変数の扱いが間違っているのは把握してます。 ### うまい表現方法などがあれば教えていただけると幸いです。
回答: 連続する二整数が現れたら,現れた時点でリストを繋ぎなおして,その後すぐにfree()してしまうべきでしょうね。 このままではメモリリークを起こしてしまいます。 一度リストから外れた要素は(別に記録しておかない限りは)もう二度と参照する方法がありませんから,後でまとめて削除することもできません。 また,このようなリストの場合,敢えて先頭にはデータを持たせないでダミーとするのもありかもしれません。 今は先頭を削除するときは`start`を書き換えなければならないので先頭と途中とで場合分けをしなければなりませんが,もし先頭をダミーの要素にしておけば,データの先頭も途中と同じように見なせます。表示するときはデータは `start->next` から読み始めればよいですし。 それで質問に関係のない部分なのですが少し。 main() 内でのfor文が10回回されていることから考えて,入力は10文字固定なんですよね。 * 9文字しか来ない等の不正な入力を考えなくてよいならば, get_num() 関数内では単純に for を 10 回回せばよいと思います。getchar()を使って判定する必要はないかと。 ついでに,配列をNULL終端させる意味はないと思います。 * 不正な入力を考えるならば, get_num() 関数の中の `(c = getchar()) != '\r'`に関してですが,(バイナリファイルなら別として)入力は勝手に`CRLF(\r\n)`を`LF(\n)`に変換してくれる場合がほとんどだと思うので,チェックしたいなら`(c = getchar()) != '\n'`にするべきなのではないでしょうか? また,配列を初期化しておかないと,10文字に満たなかった場合に,配列の後ろの残りが不正値になります。 さらに,チェックを`'\n'`に変更した場合は,最後の`while(getchar() != '\n')`を常に実行させると困ったことが起こります。10文字に満たなかった場合に,入力の`'\n'`がfor文の中で消費されてしまっていますので,もう一度改行を入力する羽目になります。 また,最後に表示させている部分の while なのですが,このままではリストの中身が全て無くなってしまった場合に落ちます。