はじめての C

線形リストを用いて 入力したデータを順に出力するプログラムを作成せよ。

できませんでした . . . おしまい。
これがうわさの「アルゴリズムとデータ構造」ですか ?
今回だけは 宮寺さんのページ から課題を借りることにしました。宮寺さんに感謝。

線形リストを用いて 入力したデータを記憶し 先頭から順に出力するプログラムを作成せよ。
(入力の終了は ctrl + 'd')

  1. /* mklist.1 */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. };
  7. struct List *get_mem(void);
  8. void show_list(struct List *);
  9. main()
  10. {
  11. struct List *start, *curr, *prev;
  12. int n; /* 2回目以後 入力するデータはすべて n で統一 */
  13. /* * * 初期設定をおこなう * * */
  14. start = get_mem(); /* 最初のノードのメモリを確保 */
  15. scanf("%d", &start->data); /* 最初のノードにデータを格納 */
  16. prev = start;
  17. start->next = NULL;
  18. /* * * データを格納して リストをつなぐ * * */
  19. while (scanf("%d", &n) != EOF) {
  20. curr = get_mem();
  21. curr->data = n;
  22. prev->next = curr; /* リストをつなぐ */
  23. prev = curr; /* 一つ前のノードを記憶 */
  24. }
  25. curr->next = NULL; /* リストの最後は NIL */
  26. /* * * データをリスト順に出力 * * */
  27. show_list(start);
  28. printf("\n");
  29. }
  30. struct List *get_mem(void) { /* ノードの領域を確保 */
  31. struct List *pm;
  32. pm = (struct List *)malloc(sizeof(struct List));
  33. return pm;
  34. }
  35. void show_list(struct List *pd) { /* リストの順に格納されたデータを出力 */
  36. while (pd != NULL) {
  37. printf("%d ", pd->data);
  38. pd = pd->next;
  39. }
  40. }

上のコードの 初期設定の部分を省略したプログラムを作成せよ。

  1. /* mklist.2 */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. };
  7. struct List *get_mem(void);
  8. void show_list(struct List *);
  9. main()
  10. {
  11. struct List *start, *curr, *prev;
  12. int n; /* 入力したデータはすべて n で統一 */
  13. prev = NULL /* ノードの中身は NIL */
  14. while (scanf("%d", &n) != EOF) {
  15. curr = get_mem(); /* ノードの領域を確保 */
  16. curr->data = n; /* ここでデータを格納 */
  17. if (prev == NULL) {
  18. start = curr; /* はじめに最初のノードへ */
  19. } else {
  20. prev->next = curr; /* リストをつなげる */
  21. }
  22. prev = curr; /* 一つ前のノードを記憶 */
  23. }
  24. curr->next = NULL;
  25. show_list(start);
  26. printf("\n");
  27. }
  28. struct List *get_mem(void) {
  29. struct List *pm;
  30. pm = (struct List *)malloc(sizeof(struct List));
  31. return pm;
  32. }
  33. void show_list(struct List *pd) {
  34. while (pd != NULL) {
  35. printf("%d", pd->data);
  36. pd = pd->next;
  37. }
  38. }

逆順につながった線形リストを作成し 入力終了後 先頭から順に出力するプログラムを作成せよ。

  1. /* mklist.3 */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. };
  7. struct List *get_mem(void);
  8. void show_list(struct List *);
  9. main()
  10. {
  11. struct List *curr, *prev;
  12. int n;
  13. prev = NULL;
  14. while (scanf("%d", &n) != EOF) {
  15. curr = get_mem();
  16. curr->data = n;
  17. curr->next = prev; /* つねに新しいデータが先頭に */
  18. prev = curr;
  19. }
  20. show_list(curr);
  21. printf("\n");
  22. }
  23. struct List *get_mem(void) {
  24. struct List *pm;
  25. pm = (struct List *)malloc(sizeof(struct List));
  26. return pm;
  27. }
  28. void show_list(struct List *pd) {
  29. while (pd != NULL) {
  30. printf("%d", pd->data);
  31. pd = pd->next;
  32. }
  33. }

双方向リストを用いて入力したデータを記憶し 先頭からと後ろからと それぞれ順に出力するプログラムを作成せよ。

  1. /* mklist.4 */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. struct List *back;
  7. };
  8. struct List *get_mem(void);
  9. void show_list(struct List *);
  10. void show_list_prev(struct List *);
  11. main()
  12. {
  13. struct List *start, *curr, *end;
  14. int n;
  15. start = get_mem();
  16. scanf("%d", &start->data);
  17. end = start;
  18. start->next = NULL;
  19. start->back = NULL;
  20. while (scanf("%d", &n) != EOF) {
  21. curr = get_mem();
  22. curr->data = n;
  23. end->next = curr; /* 両方向にリストをつなげる */
  24. curr->back = end;
  25. end = curr;
  26. }
  27. curr->next = NULL;
  28. show_list(start);
  29. printf("\n");
  30. show_list_rev(end);
  31. printf("\n");
  32. }
  33. struct List *get_mem(void) {
  34. struct List *pm;
  35. pm = (struct List *)malloc(sizeof(struct List));
  36. return pm;
  37. }
  38. void show_list(struct List *pd) {
  39. while (pd != NULL) {
  40. printf("%d", pd->data);
  41. pd = pd->next;
  42. }
  43. }
  44. void show_list_rev(struct List *pd) {
  45. while (pd != NULL) {
  46. printf("%d", pd->data);
  47. pd = pd->back; /* 逆方向に */
  48. }
  49. }

上のコードから 初期設定の部分を省略したプログラムを作成せよ。

  1. /* mklist.5 */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. struct List *back;
  7. };
  8. struct List *get_mem(void);
  9. void show_list(struct List *);
  10. void show_list_rev(struct List *);
  11. main()
  12. {
  13. struct List *start, *curr, *end;
  14. int n;
  15. end = start = NULL; /* ノードの中身は NIL */
  16. while (scanf("%d", &n) != EOF) {
  17. curr = get_mem();
  18. curr->data = n;
  19. if (start == NULL) {
  20. start = curr;
  21. } else {
  22. end->next = curr; /* リストをつなげる */
  23. curr->back = end;
  24. }
  25. end = curr;
  26. }
  27. curr->next = NULL;
  28. show_list(start);
  29. printf("\n");
  30. show_list_rev(end);
  31. printf("\n");
  32. }
  33. struct List *get_mem(void) {
  34. struct List pm;
  35. pm = (struct List *)malloc(sizeof(struct List));
  36. return pm;
  37. }
  38. void show_list(struct List *pd) {
  39. while (pd != NULL) {
  40. printf("%d", pd->data);
  41. pd = pd->next;
  42. }
  43. }
  44. void show_list_prev(struct List *pd) {
  45. while (pd != NULL) {
  46. printf("%d", pd->data);
  47. pd = pd->back;
  48. }
  49. }

つかれました . . .

text: 東京学芸大学の宮寺さんのページ