• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体について)

双方向リスト構造についての質問

このQ&Aのポイント
  • C言語で双方向リスト構造を実装しようとしています。
  • 関数内での構造体の追加方法について確認したいです。
  • また、逆方向に表示する方法も教えてください。

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

  • ベストアンサー
  • maku_x
  • ベストアンサー率44% (164/371)
回答No.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(); すれば良いかと。