プロが教える店舗&オフィスのセキュリティ対策術

C言語初心者です。以下のリスト構造を双方向リストに書き換えたいです。
構造体にstruct transcript *prvs;を追加するのはいいとして、その後どのように変更したらよいでしょうか。関数printingdudeのprvs版を追加し、メイン部でprintingdude_prvs(Z)をすればよいでしょうか。詳しい方、お手数ですがご教示頂きたいです。。

#include <stdio.h>
#include <stdlib.h>
typedef struct transcript {
int no;
struct transcript *next;
} tra;
void printingdude(tra *x) {
if (x == NULL) return;
printf("%d",x->no);
if (x->next != NULL) {
printf(", ");
printingdude(x->next);
} else {
printf("\n");
}
return;
}
void free_noud(tra *x) {
while (x != NULL) {
tra *t = x->next;
free(x);
x = t;
}
return;
}
tra* nnoud(int v, tra* c) {
tra *x = (tra *) malloc(sizeof(tra));
if (!x) {
printf("\ncan't allocate memory for a new node");
exit(EXIT_FAILURE);
}
x->no = v;
x->next = c;
return x;
}
int main() {
tra *Z = NULL;

for (int n = 10; n>0; n--) {
printingdude(Z);
Z = nnoud(n, Z);
}
printingdude(Z);
free_noud(Z);
return 0;
}

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/02 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!