質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

475閲覧

双方向リストのprevが動かない

Red_Bull

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/05/09 14:37

編集2022/05/09 15:03

双方向リストがわかりません。
具体的には prev の使い方がわからないです。
nexttest.h で書いただけで正常に動いているのに対し、prev が動かないのにはどのような理由があるのかを教えていただきたいです。

int list_print_backでStation_doublyリストを後ろからprintしたいのですがプリントされません。
全体の文章が長くなってしまいすみません。

よろしくお願いいたします。

出力
あ(0.0km) い(0.5km) う(1.0km) え(1.5km) お(2.0km)

test.h

1typedef struct station { 2 char name[60]; //最大20文字 3 float dist; 4 struct station_doubly *next; 5 struct station_doubly *prev; 6} Station_doubly; 7 8int list_print(Station_doubly *list); 9int list_print_back(Station_doubly *list); 10Station_doubly *list_init();

list_print_back.c

1#include<stdio.h> 2#include<stdlib.h> 3#include "test.h" 4int list_print_back(Station_doubly *list) { 5 Station_doubly *pt, *pt0; 6 pt0=list; 7 pt = list->next; 8 if (pt==NULL) printf("NULL"); 9 while (pt!=NULL) { 10 pt = pt->next; 11 pt0=pt0->next; 12 } 13 14 while (pt0!=NULL) { 15 printf("%s(%3.1fkm) ", pt0->name, pt0->dist); 16 pt0=pt0->prev; 17 } 18 printf("\n"); 19 return 0; 20};

list_init.c

1#include<stdio.h> 2#include<stdlib.h> 3#include "test.h" 4Station_doubly *list_init() { 5 Station_doubly *list, *pt; 6 list = node_create("dummy", 0.0); //ダミーノード用 7 pt = list; 8 list_insert_doubly(pt, "あ", 0.0); 9 pt = pt->next; 10 list_insert_doubly(pt, "い", 0.5); 11 pt = pt->next; 12 list_insert_doubly(pt, "う", 1.0); 13 pt = pt->next; 14 list_insert_doubly(pt, "え", 1.5); 15 pt = pt->next; 16 list_insert_doubly(pt, "お", 2.0); 17 return list; 18}

list_print.c

1#include<stdio.h> 2#include<stdlib.h> 3#include "test.h" 4int list_print(Station_doubly *list) { 5 Station_doubly *pt; 6 pt = list->next; 7 if (pt==NULL) printf("NULL"); 8 while (pt!=NULL) { 9 printf("%s(%3.1fkm) ", pt->name, pt->dist); 10 pt = pt->next; 11 } 12 printf("\n"); 13 return 0; 14};

main.c

1#include<stdio.h> 2#include<stdlib.h> 3#include "test.h" 4int main(void){ 5 int listmax=20; 6 Station_doubly *list, *pt; 7 list = list_init(); 8 list_print(list); 9 list_print_back(list); 10 return 0; 11}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/05/09 14:50

test.h と list_print_back.c だけでは、こちらでは動かせないので、何が起きているのか全く分かりません。
Red_Bull

2022/05/09 15:09

説明不足ですみません。 修正いたしました。
jimbe

2022/05/09 17:52

追加有難う御座います。 ですが、 list_init から呼んでいる node_create と list_insert_doubly が不足しています。 ちなみに、これらのコードは全てご自身で書かれたのでしょうか。それとも幾つかは何方かが書かれた物でしょうか。
guest

回答1

0

node_createlist_insert_doubly の定義が見当たらないのでテキトーに作ってみた場合。

list_init.c

c

1Station_doubly *node_create(char *item, float dist) { 2 Station_doubly *sd = (Station_doubly *)malloc(sizeof(Station_doubly)); 3 strcpy(sd->name, item); 4 sd->dist = dist; 5 sd->prev = NULL; 6 sd->next = NULL; 7 return sd; 8} 9 10void list_insert_doubly(Station_doubly *pt, char *item, float dist) { 11 Station_doubly *append = node_create(item, dist); 12 pt->next = append; 13 append->prev = pt; 14 append->next = NULL; 15 return; 16}

test.h

c

1typedef struct station { 2 char name[60]; //最大20文字 3 float dist; 4 struct station *next; 5 struct station *prev; 6} Station_doubly;

main.c

c

1int main(void){ 2 Station_doubly *list; 3 list = list_init(); 4 list_print(list); 5 list_print_back(list); 6 7 // free 8 Station_doubly *pc, *pn; 9 pc = list; 10 while(pc!=NULL) { 11 pn = pc->next; 12 free(pc); 13 pc = pn; 14 } 15 return 0; 16}

実行結果

bash

1$ gcc --version 2gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0 3$ gcc -std=gnu2x -fsanitize=address -I. -g -Wall -Wextra -c *.c 4$ gcc -o main *.o -lasan 5$ ./main 6(0.0km)(0.5km)(1.0km)(1.5km)(2.0km) 7(2.0km)(1.5km)(1.0km)(0.5km)(0.0km) dummy(0.0km)

投稿2022/05/09 19:17

編集2022/05/09 19:32
melian

総合スコア19749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/05/10 01:38

>お(2.0km) え(1.5km) う(1.0km) い(0.5km) あ(0.0km) dummy(0.0km) dummy は表示されないほうが良いのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問