• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体のポインタ)

構造体のポインタを使用して連結リストを表示する方法

このQ&Aのポイント
  • 構造体のポインタを使用して連結リストを表示する方法について説明します。
  • gyuri[23] -> sunyon[23] -> nicole[20] -> hara[20] -> jiyon[17] の連結リストを表示することができますが、逆の順番で表示することができません。
  • この問題を解決するために、構造体にprev(前の要素へのポインタ)を追加し、リストを逆順でたどることができるようにします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

このプログラムは異常終了しませんか? あるいは、最適化で無意味なコードが除去されているために異常終了はしないかもしれません。 printoufukuという関数について、 まず、p = p->nextだと、p->nextの指す値をpに代入するので意味があるコードですが、ただ、p->nextと書いているのはあってもなくても同じです。 for(p->next; p != NULL;p = p->next){ printf("%s[%d] ->",p->name,p->age); } となっているということは、このループを抜けたときはp!=NULLでないつまり、p == NULLになっています。 つぎに、p != NULLと比較して、NULLなのでこのプログラムは終了します。 for(p->prev; p != NULL; p = p->prev){ printf("%s[%d] ->",p->name,p->age); } もしかして、本当にやりたいことはこうではないでしょうか? void printoufuku(struct kara *p) { struct kara *pp; for(; p != NULL;p = p->next){ printf("%s[%d] ->",p->name,p->age); pp = p; } for(; pp != NULL; pp = pp->prev){ printf("%s[%d] ->",pp->name,pp->age); } 最初のfor文でリストの最後の要素までたぐりますが、そのときに今見ている要素をppに保存します。こうすることで、折り返し地点を覚えておきます。p == NULLになったとき、ppは折り返し地点を指しています。

関連するQ&A