- 締切済み
連結リスト
下の連結リストのプログラムに、入力データを確認するための出力部分を追加するという課題が出ましたが分かりませんでした。 要するに下から3行目にあるWriteLinkedList関数を作ればよいということらしいのですが、教えてください。お願いします。 ちなみに1行目にある「pseudo10.h」は先生が作ったプログラムだそうです。ほかに必要な情報があれば教えてください。 #include "pseudo10.h" typedef struct PERSON * PtrPERSON; struct PERSON{ char name[20]; //name long year; //age PtrPERSON next; //pointer }; int MakeLinkedList(PtrPERSON head){ PtrPERSON girl; New(PtrPERSON, girl) InputString(girl->name); InputInt(girl->year); while(girl->year > 0){ girl->next = head -> next; head->next = girl; New(PtrPERSON, girl); InputString(giel->name); InputInt(girl->year); } return 0; } int main(void){ PtrPERSON head; New(PtrPERSON, head); head->next = NULL; MakeLinkedList(head); WriteLinkedList(head); return 0; }}
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
>としたところ、Segmentation faultが出ました。 正常動作なので問題ありません。 『コードで指定した』想定通りの動作であり、OSが正しく動作していいる証拠でもあります。 head->yearの出力を除けば、環境によってはSegmentation faultにならずに済むかも知れません。 # 学生の名前が「(null)」と表示されれば。 headが「NULLになる」のと、それが「評価される」のと、「参照される」のと……どういう順番で処理されているのかよく見てみましょうね。 判らなければwhileループの中でステップ実行してみたらよいでしょう。 あと…その連結リストの先頭のデータは表示されない。 元々、有効なデータが入っていたのかも疑問ではあるが……。 # HEAD保持用にデータ入れていない構造体を用意する。なんて処理を組んだとはあるな。構造体1個分のメモリが無駄になるのを理解しつつ。 # HEAD保持をポインタにした場合にnullチェックが面倒だった…という回避用にそうしたんだったかなぁ…。リスト辿る時に終端としてのnullチェックは必須だったし。
- wormhole
- ベストアンサー率28% (1626/5665)
pseudo10.h には #define New(type,pvar) pvar = (type)malloc(sizeof(type)) とか書かれているんじゃないかという想定なんですが。 >#4 実行されてないプログラム(実行ファイルになってないもの、できないものも含む)でメモリリークが起きるなんていう気はないです。 ですがMakeLinkedListの処理で最後にNew()で確保される(であろう)メモリは、そのまま連結リストに加えられることなく放置されるわけで。
- Wr5
- ベストアンサー率53% (2173/4061)
pseudo10.hの中身が不明…ですからねぇ……。 参照渡しなんでしょうか??? # が…MakeLinkedList()は参照渡しになっていない…よな???? ここは……(出題者の)先生のご登場を待つしかないですかね。 とりあえず、あっちのカテではコード読もうともしなかったけど。 勝ち組にして差し上げようかとも思いましたが… # ちょっと(要求仕様は満たしていて、かつ課題として提出した場合に正解にはならないようなコードを作るのが)面倒だったのでコードまで検証していなかった。
- Tacosan
- ベストアンサー率23% (3656/15482)
http://okwave.jp/qa/q8600623.html とはどこがどう違うんでしょうか? 余談ですが, このままでは実行できない以上「メモリリーク」することはあり得ないですよね>#1.
- maiko0318
- ベストアンサー率21% (1483/6969)
教科書に結構そのまま載っていますよ。 連結リストの基本ですからね。
- Wr5
- ベストアンサー率53% (2173/4061)
授業で習っていないことははっきりと言った方がいいですよ? # 単純に出席していなかったら「習っていない」のであれば、お悔やみを申し上げますが。
- wormhole
- ベストアンサー率28% (1626/5665)
連結リストというのはどういうものなのか理解はできていますか? ちなみにMakeLinkedList()にはメモリリークするバグあります。
補足
int WriteLinkedList(PtrPERSON head){ PtrPERSON girl; while(head != NULL){ head = head->next; printf("%s %d\n", head->name, head->year); } } としたところ、Segmentation faultが出ました。