前提・実現したいこと
C言語で線形リストを用いて講義の科目名、単位数、成績をリストに保存できるプログラムを作成しています。
コンパイルは問題なく通るのですが実行すると上手く動かないため質問させていただきます。
発生している問題・エラーメッセージ
実行後、1を入力してデータを追加すると途中で終了してしまいます(以下が実行結果)
C:\Users\tar\program>a
1:科目の追加 2:科目の挿入 3:要素の削除
4:要素の表示 5:GPAの表示 0:終了
操作を入力してください:1
科目名を入力してください:w
単位数を入力してください:1
GPを入力してください2
aa
ただしスイッチ文のcase1の中のprintf内の文章を長めの文字(ここでは0000000)に変更すると以下のように実行できます。
C:\Users\tar\program>a
1:科目の追加 2:科目の挿入 3:要素の削除
4:要素の表示 5:GPAの表示 0:終了
操作を入力してください:1
科目名を入力してください:w
単位数を入力してください:1
GPを入力してください2
0000000
aaii1:科目の追加 2:科目の挿入 3:要素の削除
4:要素の表示 5:GPAの表示 0:終了
操作を入力してください:4
length = 1
w 1 2.00
1:科目の追加 2:科目の挿入 3:要素の削除
4:要素の表示 5:GPAの表示 0:終了
操作を入力してください:0
aaまで表示できることからmallocの使い方が悪いと思うのですが、どのように改善したらよいか分かりません。
今回の質問に関係のないremovedata関数やinsertdata関数は省略させていただきました。
ご教示よろしくお願いいたします。
該当のソースコード
#include <stdio.h> #include <stdlib.h> /* 要素データの構造定義 */ struct Data { char *name; int num; double gp; struct Data *pNext; }; typedef struct Data data; /* リストの構造定義 */ typedef struct { data *pHead; int length; } List; /* 関数プロトタイプ */ void initialize(List*); void disp(List); void adddata(List*, char*, int, double); void removedata(List*, int); void insertdata(List*, int, char*, int, double); int main() { char str[30]; int num, n, mode; double gp; /* リスト型の宣言 */ List v; /* 初期化 */ initialize(&v); do{ printf("1:科目の追加\t2:科目の挿入\t3:要素の削除\n"); printf("4:要素の表\示\t5:GPAの表\示\t0:終了\n"); printf("操作を入力してください:"); scanf("%d", &mode); switch(mode){ case 1 : printf("科目名を入力してください:"); scanf("%s",str); printf("単位数を入力してください:"); scanf("%d",&num); printf("GPを入力してください"); scanf("%lf", &gp); printf("\n"); adddata(&v, str, num, gp); break; case 2 : printf("科目名を入力してください:"); scanf("%s",str); printf("単位数を入力してください:"); scanf("%d",&num); printf("GPを入力してください"); scanf("%lf", &gp); printf("何番目の前に挿入しますか:"); scanf("%d",&n); printf("\n"); insertdata(&v, n-1, str, num, gp); break; case 3 : printf("何番目を削除しますか:"); scanf("%d", &n); removedata(&v, n); break; case 4 : printf("length = %d\n", v.length); disp(v); break; case 0 : break; default: printf("正しい値を入力してください\n"); break; } }while(mode != 0); /* 全要素の削除 */ while(v.pHead == NULL){ removedata(&v, 1); } return 0; } /* 線形リストの初期化 */ void initialize(List *pV) { pV->pHead = NULL; pV->length = 0; } /* 要素の表示 */ void disp(List v) { data *pd; pd = v.pHead; if(pd == NULL) printf("リストには何もありません。\n"); else { while(pd != NULL) { printf("%s\t%d\t%1.2f\n", pd->name,pd->num,pd->gp); pd = pd->pNext; } } } /* 要素の追加 */ void adddata(List *pV, char *name, int num, double gp) { /* 最後尾要素のポインタ */ data *pLast; /* 新規に追加する要素の生成 */ data *pNew; printf("aa"); pNew->name = (char*)malloc(sizeof(name)); printf("aaaa"); pNew = (data*)malloc(sizeof(data));/* 領域確保 */ pNew->name = name; pNew->num = num; pNew->gp = gp; pNew->pNext = NULL; if( pV->pHead == NULL ) { /* リストが空の場合 */ pV->pHead = pNew; /* 新規要素を先頭にリンク */ } else { /* リストが空でない場合 */ pLast = pV->pHead; while( pLast->pNext != NULL ) /* 最後尾を探索 */ pLast = pLast->pNext; pLast->pNext = pNew; /* 新規要素を最後尾にリンク */ } pV->length++; }
補足情報(FW/ツールのバージョンなど)
OS:windows10
コンパイラ:gcc
回答3件
あなたの回答
tips
プレビュー