• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リスト構造を双方向リスト構造に書き換えたいです)

C言語初心者のための双方向リストへの書き換え方法

このQ&Aのポイント
  • C言語初心者の方に向けて、リスト構造を双方向リスト構造に書き換える方法を説明します。
  • 構造体にstruct transcript *prvs;を追加し、関数printingdudeのprvs版を追加することで、リスト構造を双方向リストに変更できます。
  • さらに、メイン部でprintingdude_prvs(Z)を呼び出すことで、変更後のリストを出力することができます。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

こんな感じでしょうか。変数名と関数名を一部変更しています。 #include <stdio.h> #include <stdlib.h> typedef struct transcript { int no; struct transcript *next; struct transcript *prev; } tra; void printNode(tra *p) { tra *q; printf("【正順】\n"); for (q = p->next; q->next; q = q->next) { printf("%d", q->no); if (q->next->next) { printf(", "); } } printf("\n\n"); } void printNodeReverse(tra *p) { tra *q; printf("【逆順】\n"); for (q = p->prev; q->prev; q = q->prev) { printf("%d", q->no); if (q->prev->prev) { printf(", "); } } printf("\n\n"); } void freeNode(tra *p) { tra *q; for (; p; p = q) { q = p->next; free(p); } } tra *allocNode(void) { tra *p; p = (tra *) malloc(sizeof(tra)); if (!p) { printf("can't allocate memory for a new node\n"); exit(EXIT_FAILURE); } return p; } tra *newNode(int val, tra *p, tra *q) { tra *r; r = allocNode(); r->no = val; r->prev = p; r->next = q; p->next = q->prev = r; return r; } int main(void) { tra *head, *tail, *p; int n; head = allocNode(); tail = allocNode(); head->next = tail, head->prev = NULL; tail->prev = head, tail->next = NULL; for (p = head, n = 0; n < 10; n++) { p = newNode(n, p, tail); } printNode(head); printNodeReverse(tail); freeNode(head); return 0; }

redhat_001
質問者

お礼

有り難うございます。大変参考になります。 まだ完全に理解出来ていないところがありますが、一行ずつ触ってみて動作を確認してみます。。有り難うございました。

関連するQ&A