- ベストアンサー
線形リストに挿入するプログラム
連結リストに要素を挿入する関数 insert( ) を関数を定義して,以下の条件の下で整数型の要素を連結リストに挿入するプログラムを作成しなければならないのですが、関数insert部分が見当がつきません. 回答よろしくおねがいします。 条件 1. 関数名を insert( ) とする. 2. 連結リストの先頭ノードを指すポインタ(*head)と,リストに挿入する要素(data)を引数とする. 3. 連結リストの先頭ノードを指すポインタ(*head)からたどって,要素がリスト内で降順(大きいものから小さいものへの順)となる位置に要素を挿入する. 4. 引数で示された要素が既にリストに存在する場合には,要素の挿入は行なわない. #include <stdio.h> #include <stdlib.h> typedef struct __cell { int data; struct __cell *next; } CELL; CELL *insert(CELL *head, int data); void showList(CELL *head); int main(void) { CELL *head; head = NULL; head = insert(head, 5); showList(head); head = insert(head, 2); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 1); showList(head); return 0; } CELL *insert(CELL *head, int data) { /*ここで関数 insert( ) を定義します*/ } void showList(CELL *head) { CELL *p; for(p=head ; p!=NULL ; p=(*p).next) { printf("%d -> ", (*p).data); } printf("fin\n"); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「適切な位置を見つける」のは値の比較でしょう。 降順ソートだからp->nextがNULLもしくはp->next->data < dataになるタイミングですかね。 #余談:アロー演算子はスマートってのもあるんですがこっちの方が普及してるんで「他人が見やすい」ということもあります。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
リスト構造の先頭にダミーノードを設けると、 insert() のロジックが少しだけ簡単になります。 今回はダミーノードを設けるのは有りですか? それから、(*p).data と書いてもいいのですが、 ここはアロー演算子を使って p->data とスマートに書きましょう。
補足
回答ありがとうございます。 今回の場合はダミーノードは使用しない方法でお願いします。 スマート・・・ですね笑 気をつけます。
- Tacosan
- ベストアンサー率23% (3656/15482)
例えば, 3 のうちの 「連結リストの先頭ノードを指すポインタ(*head)からたどって適切な位置を見付ける」 ことはできませんか?
補足
回答ありがとうございます。 リストを先頭からたどる方法としては、 for( p = head ; p! = NULL ; p = p->next) と、この条件で回して行けば先頭からたどれるとは思うのですが、 「適切な位置を見つける」という部分がどうにも理解できなくて・・・
お礼
解決しました。 丁寧な回答ありがとうございましたー