前提・実現したいこと
・前提
http://www9.plala.or.jp/sgwr-t/c/sec15-5.html のサイトを拝見させていただき参考にプログラムを作成しました。また主にこのサイトにある説明でリスト構造については学習をしました。
・実現したいこと
構造体をリスト形式にし、入力をリストに格納。それを逆順(リスト的には逆、入力でみると順になるが)で表示するプログラムの出力を正常にしたいです。
リストに格納した順番(3,3 2,2 1,1)の形では出力がうまくいっているため、自らで作成したreverse_list関数内で間違いが起きてると思いますが、ここで長時間止まってしまっているので質問させていただきます。
発生している問題・エラーメッセージ
2つの数を入力してください(両方0で終了) num1 = 1 num2 = 1 ------------------------- num1 = 2 num2 = 2 ------------------------- num1 = 3 num2 = 3 ------------------------- num1 = 0 num2 = 0 -------------------------
最後の破線の下に入力順に値が表示される予定ですが何も表示されません。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4/* 構造体定義 */ 5struct list{ 6 int num1,num2; 7 struct list *next; 8}; 9 10/* 関数定義 */ 11struct list *add_list(int x,int y,struct list *head); 12struct list *reverse_list(struct list *head,struct list *head2); 13void show_list(struct list *p); 14void free_list(struct list *p); 15 16 17int main(void){ 18 struct list *head; //先頭ポインタ 19 struct list *head2; //順(リストを逆から)表示するためのポインタ 20 21 int num1,num2; 22 23 head = NULL; //先頭ポインタにNULLを代入 24 head2 = NULL; 25 26 /* 入力処理 */ 27 printf("2つの数を入力してください(両方0で終了)\n"); 28 while(1){ 29 printf("num1 = "); 30 scanf("%d",&num1); 31 printf("num2 = "); 32 scanf("%d",&num2); 33 printf("-------------------------\n"); 34 35 //終了条件 36 if(num1 == 0 && num2 == 0) break; 37 38 head = add_list(num1,num2,head); 39 } 40 41 head2 = reverse_list(head,head2); 42 show_list(head2); 43 free_list(head); 44 free_list(head2); 45} 46 47/* リストにデータを格納する関数 */ 48struct list *add_list(int num1,int num2,struct list *head){ 49 struct list *p; 50 51 //記憶領域の確保 52 if((p = (struct list *)malloc(sizeof(struct list))) == NULL){ 53 printf("malloc error\n"); 54 exit(EXIT_FAILURE); 55 } 56 57 //リストにデータを登録 58 p->num1 = num1; 59 p->num2 = num2; 60 61 //ポインタの繋ぎ変え 62 p->next = head; //今までの先頭ポインタを次ポインタに 63 head = p; //新たな領域を先頭ポインタに 64 65 return head; 66} 67 68/* データを順に格納する関数 */ 69struct list *reverse_list(struct list *head,struct list *head2) 70{ 71 struct list *p; 72 73 //記憶領域の確保 74 if((p = (struct list *)malloc(sizeof(struct list))) == NULL){ 75 printf("malloc error\n"); 76 exit(EXIT_FAILURE); 77 } 78 79 while(head != NULL){ 80 head2->num1 = head->num1; 81 head2->num2 = head->num2; 82 83 p->next = head2; 84 head2 = p; 85 86 head = head->next; 87 } 88 89 return p; 90} 91 92/* リストのデータを表示する関数 */ 93void show_list(struct list *p) 94{ 95 while (p != NULL) { /* 次ポインタがNULLまで処理 */ 96 printf("num1=%d,num2=%d\n", p->num1, p->num2); 97 p = p->next; 98 } 99} 100 101/* リスト解放の関数 */ 102void free_list(struct list *p) 103{ 104 struct list *p2; 105 106 while (p != NULL) { /* 次ポインタがNULLまで処理 */ 107 p2 = p->next; 108 free(p); 109 p = p2; 110 } 111}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/05 23:48