• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語 片方向連結リスト)

C言語の片方向連結リストのプログラムについて質問

このQ&Aのポイント
  • C言語の片方向連結リストのプログラムについて質問があります。
  • リスト中の値を持つセルの位置を取得する関数とセルを挿入する関数のコードを教えてください。
  • セルの位置を取得する関数はint get_index(ListPtr l, int value)です。

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

  • ベストアンサー
  • POMPUG
  • ベストアンサー率60% (3/5)
回答No.1

修正した関数:add_first 実装した関数:get_index, add 星印が付いているところが修正箇所です。 /* ★リスト l の先頭にセルを挿入 */ void add_first(ListPtr l, int val) { NodePtr n = NULL; /* ★今の先頭セルの次があるならそれを覚えておく */ NodePtr next = NULL; if(l && l->head) next = l->head; n = create_node(val); /* ★nの次はNULLまたは先頭であったノードなのでnextを入れる */ /* n->next = l->head; ←間違い */ n->next = next; l->head = n; } /* ★リスト l において値 val を持つセルの位置を返す */ int get_index(ListPtr l, int value) { int i; int len = get_list_size(l); for(i = 0 ; i < len ; i++) { if(get_value(l, i) == value) { return i; } } return -1; } /* ★リスト l の位置 index に値 val を持つセルを挿入 */ void add(ListPtr l, int index, int value) { int len = get_list_size(l); /* リストの先頭に追加する場合はここで処理をして抜ける */ if(index == 0) { add_first(l, value); return; } /* indexが1以上の場合は挿入する位置を探す。pは挿入する位置であり、p_prev_nodeはpの一つ手前のノードである */ NodePtr p = l->head; NodePtr p_prev_node = NULL; while(index > 0) { if(p == NULL) { /* 挿入する位置が無い場合で且つindexが0になっていない場合は指定された位置に正しく入れることができない。よって仕様では無視する事になっているためここで戻る。 */ return; } p_prev_node = p; p = p->next; index--; } /* 新しいノードを作る */ NodePtr new_node = create_node(value); /* 挿入する位置のひとつ前のノード(p_prev_node)の次に今作ったノードをつなぐ */ p_prev_node->next = new_node; /* 今作ったノードの次に、挿入する位置にあったノード(p)をつなぐ。pはNULLでもよい。その場合は最後のノードという意味である。 */ new_node->next = p; } /* 連結リストの使用例 */ int main(void) { FILE *fp = NULL; char buf[10]; int age; ListPtr l = NULL; l = create_list(); add_first(l, 28); add_first(l, 40); add_first(l, 33); add_first(l, 15); /* ★重複する場合のテストのため同じ値を追加 */ add_first(l, 33); print_list(l); /* ★ get_indexのテスト */ printf("値15の位置は%dです。\n", get_index(l, 15)); printf("値33の位置は%dです。複数ある場合は先に見つかった方。\n", get_index(l, 33)); printf("値40の位置は%dです。\n", get_index(l, 40)); printf("値28の位置は%dです。\n", get_index(l, 28)); /* ★ addのテスト1 */ printf("\nindex=0に値0をaddした結果\n"); add(l, 0, 0); print_list(l); /* ★ addのテスト2 */ printf("\nindex=99に値99をaddした結果(無視される)\n"); add(l, 99, 99); /* 無視される */ print_list(l); /* ★ addのテスト3 */ printf("\nindex=2に値2をaddした結果\n"); add(l, 2, 2); print_list(l); /* ★ addのテスト4 */ printf("\nindex=7に値7をaddした結果(最後のノードとして追加できることの検証)\n"); add(l, 7, 7); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); /* ★ 削除 */ delete_list(l); return 0; }

caneo_bote
質問者

お礼

遅れてすみません.解答ありがとうございました!

関連するQ&A

専門家に質問してみよう