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;
}
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;
}
有り難うございます。大変参考になります。
まだ完全に理解出来ていないところがありますが、一行ずつ触ってみて動作を確認してみます。。有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
C言語に関する質問です
-
万年カレンダーのC言語プログラ...
-
【C言語教えてください】sin波...
-
文字を動かしたい
-
球の体積と表面積を表示するプ...
-
ホームページをC言語で作りたい...
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
printf で二進表示を行いたい。
-
C言語
-
%P と %X の違い
-
改行について 1行に何個かづ...
-
円の面積を求めるプログラミン...
-
C言語で入力した変数の値から三...
-
unsigned int型について
-
c言語で2000年以降カレンダーを...
-
C言語 文字列の比較 compare
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報