はじめての C
線形リストを用いて 入力したデータを順に出力するプログラムを作成せよ。
できませんでした . . . おしまい。
これがうわさの「アルゴリズムとデータ構造」ですか ?
今回だけは 宮寺さんのページ から課題を借りることにしました。宮寺さんに感謝。
線形リストを用いて 入力したデータを記憶し 先頭から順に出力するプログラムを作成せよ。
(入力の終了は ctrl + 'd')
- /* mklist.1 */
- #include
- struct List {
- int data;
- struct List *next;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- main()
- {
- struct List *start, *curr, *prev;
- int n; /* 2回目以後 入力するデータはすべて n で統一 */
- /* * * 初期設定をおこなう * * */
- start = get_mem(); /* 最初のノードのメモリを確保 */
- scanf("%d", &start->data); /* 最初のノードにデータを格納 */
- prev = start;
- start->next = NULL;
- /* * * データを格納して リストをつなぐ * * */
- while (scanf("%d", &n) != EOF) {
- curr = get_mem();
- curr->data = n;
- prev->next = curr; /* リストをつなぐ */
- prev = curr; /* 一つ前のノードを記憶 */
- }
- curr->next = NULL; /* リストの最後は NIL */
- /* * * データをリスト順に出力 * * */
- show_list(start);
- printf("\n");
- }
- struct List *get_mem(void) { /* ノードの領域を確保 */
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) { /* リストの順に格納されたデータを出力 */
- while (pd != NULL) {
- printf("%d ", pd->data);
- pd = pd->next;
- }
- }
上のコードの 初期設定の部分を省略したプログラムを作成せよ。
- /* mklist.2 */
- #include
- struct List {
- int data;
- struct List *next;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- main()
- {
- struct List *start, *curr, *prev;
- int n; /* 入力したデータはすべて n で統一 */
- prev = NULL /* ノードの中身は NIL */
- while (scanf("%d", &n) != EOF) {
- curr = get_mem(); /* ノードの領域を確保 */
- curr->data = n; /* ここでデータを格納 */
- if (prev == NULL) {
- start = curr; /* はじめに最初のノードへ */
- } else {
- prev->next = curr; /* リストをつなげる */
- }
- prev = curr; /* 一つ前のノードを記憶 */
- }
- curr->next = NULL;
- show_list(start);
- printf("\n");
- }
- struct List *get_mem(void) {
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- }
- }
逆順につながった線形リストを作成し 入力終了後 先頭から順に出力するプログラムを作成せよ。
- /* mklist.3 */
- #include
- struct List {
- int data;
- struct List *next;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- main()
- {
- struct List *curr, *prev;
- int n;
- prev = NULL;
- while (scanf("%d", &n) != EOF) {
- curr = get_mem();
- curr->data = n;
- curr->next = prev; /* つねに新しいデータが先頭に */
- prev = curr;
- }
- show_list(curr);
- printf("\n");
- }
- struct List *get_mem(void) {
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- }
- }
双方向リストを用いて入力したデータを記憶し 先頭からと後ろからと それぞれ順に出力するプログラムを作成せよ。
- /* mklist.4 */
- #include
- struct List {
- int data;
- struct List *next;
- struct List *back;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- void show_list_prev(struct List *);
- main()
- {
- struct List *start, *curr, *end;
- int n;
- start = get_mem();
- scanf("%d", &start->data);
- end = start;
- start->next = NULL;
- start->back = NULL;
- while (scanf("%d", &n) != EOF) {
- curr = get_mem();
- curr->data = n;
- end->next = curr; /* 両方向にリストをつなげる */
- curr->back = end;
- end = curr;
- }
- curr->next = NULL;
- show_list(start);
- printf("\n");
- show_list_rev(end);
- printf("\n");
- }
- struct List *get_mem(void) {
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- }
- }
- void show_list_rev(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->back; /* 逆方向に */
- }
- }
上のコードから 初期設定の部分を省略したプログラムを作成せよ。
- /* mklist.5 */
- #include
- struct List {
- int data;
- struct List *next;
- struct List *back;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- void show_list_rev(struct List *);
- main()
- {
- struct List *start, *curr, *end;
- int n;
- end = start = NULL; /* ノードの中身は NIL */
- while (scanf("%d", &n) != EOF) {
- curr = get_mem();
- curr->data = n;
- if (start == NULL) {
- start = curr;
- } else {
- end->next = curr; /* リストをつなげる */
- curr->back = end;
- }
- end = curr;
- }
- curr->next = NULL;
- show_list(start);
- printf("\n");
- show_list_rev(end);
- printf("\n");
- }
- struct List *get_mem(void) {
- struct List pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- }
- }
- void show_list_prev(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->back;
- }
- }
つかれました . . .
text: 東京学芸大学の宮寺さんのページ