- ベストアンサー
双方向リスト構造についての質問
- C言語で双方向リスト構造を実装しようとしています。
- 関数内での構造体の追加方法について確認したいです。
- また、逆方向に表示する方法も教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
実行環境があれば、最低限コンパイラ位は通して欲しいのですが、 まず、 > struct number *next; > struct number *prev; は、 struct num *next; struct num *prev; ですね. それと、 > (*s)->ago = NULL; は、 (*s)->prev = NULL; ですね. 以上はコンパイラにかければチェックしてくれますから、記述ミスが分かります。 あと、処理上の便宜のため、Numリストの先頭と末尾を保存する構造体を定義し、 typedef struct numedge { Num *head; Num *tail; } NumEdge; static NumEdge num_edge = {(Num *)NULL, (Num *)NULL}; として、 /* リストの先頭を設定 */ Num *set_num_head(Num *p) { if (p != NULL) { num_edge.head = p; } return p; } /* リストの末尾を設定 */ Num *set_num_tail(Num *p) { if (p != NULL) { num_edge.tail = p; } return p; } /* リストの先頭を取得 */ Num *get_num_head(void) { return num_edge.head; } /* リストの末尾を取得 */ Num *get_num_tail(void) { return num_edge.tail; } /* 1個のリストの追加 */ void aplist(Num **s,char ns[]){ Num *old, *new; if(*s == NULL){ *s = (Num *)malloc(sizeof(Num)); strcpy((*s)->rv,ns); (*s)->next = NULL; (*s)->prev = NULL; set_num_head(*s); set_num_tail(*s); } else { old = get_num_tail(); new = (Num *)malloc(sizeof(Num)); strcpy(new->rv,ns); new->next = NULL; old->next = new; new->prev = old; set_num_tail(new); } return; } と言う感じにしますね. > このリストを逆方向(prevの方向)に表示していきたいのですが は、 /* 1個のリストを出力 */ void print_a_list(Num *p) { if (p != NULL) { printf("'%s'\n", p->rv); } return; } /* 全部のリストを逆順に出力 */ void print_all_list_rev(void) { Num *p; if ((p = get_num_tail()) != NULL) { printf("print all list reverse:\n"); do { print_a_list(p); } while ((p = p->prev) != NULL); printf("done.\n"); } return; } で、任意の場所から、 print_all_list_rev(); すれば良いかと。