リスト構造への追加
画面から場所とデータを入力し、リスト構造にデータを追加するプログラムを作りました。
しかしコンパイルは通ったのですが実行するとセグメンテーション違反と表示されてしまいます。
どこがおかしいのでしょうか。教えて欲しいです。
よろしくおねがいします。
該当のソースコード
c言語
1#include <stdio.h> 2#include <stdlib.h> 3 4#define FILENAME "data_2105.txt" 5 6struct LIST { 7 int score; 8 struct LIST *next; 9}; 10typedef struct LIST LIST; 11 12 13// リストを表示する関数 14void show_list(LIST *lh){ 15 LIST *p; 16 p=lh; 17 while(p != NULL){ 18 printf(" -> %d" , p->score); 19 p=p->next; 20} 21 printf("\n"); 22} 23 24 25int main( void ) { 26 int dat; 27 int place,data,i; 28 LIST *listhead = NULL; // リストの先頭へのポインタ 29 LIST *listtail = NULL; // リストの末尾へのポインタ 30 LIST *p,*q,*r,*temp; // 一時ポインタ 31 FILE *fp; // ファイルポインタ 32 33 // ファイルを開く 34 if ( ( fp = fopen( FILENAME, "r" ) ) == NULL ) { 35 fprintf( stderr,"ファイルが開けません\n" ); 36 exit( 1 ); 37 } 38 39 40 // データを読み込み、構造体リストに格納する 41 while( fscanf( fp, "%d", &dat) != EOF ) { 42 43 // 構造体を1個準備し,データを入力する 44 p = ( LIST * )malloc( sizeof( LIST ) ); 45 p->score = dat; 46 p->next = NULL; 47 48 // 1個目のデータのときはリストの先頭に接続する,同時に末尾も登録する 49 if ( listhead == NULL ) { 50 listhead=p; 51 listtail=p; 52 53 } 54 // 2個目以降のデータのときはリストの末尾に接続する 55 else { 56 listtail->next=p; 57 listtail=p; 58 59 } 60 } 61 62 // リストに格納されたデータを表示する 63 show_list( listhead ); 64 65 //リストへの追加 66do{ 67//データの読み込み 68 printf("挿入場所(-1で終了) ; "); 69 scanf("%d" , &place); 70 printf("データ ; "); 71 scanf("%d" , &data); 72 r = ( LIST * )malloc( sizeof( LIST ) ); 73 r->score=data; 74 r->next=NULL; 75//場所が最初の場合 76 if(place==0){ 77 temp=listhead; 78 listhead=r; 79 listhead->next=temp; 80 show_list( listhead ); 81 }else{ 82//場所が最初以外の場合 83for(i=0;i<=place-1;i++){ 84 if(i==0){ 85 temp=listhead; 86 temp=r; 87 listtail=r; 88 } 89 temp= temp->next; 90} 91 r->next=temp->next; 92 temp->next=r; 93show_list( listhead ); 94} 95 96 }while(place !=-1); 97 // リストのメモリを開放する 98 while(p != NULL){ 99 q=p->next; 100 free(p); 101 p=q; 102} 103 while(r !=NULL){ 104 q=r->next; 105 free(r); 106 r=q; 107} 108 109 // ファイルを閉じる 110 fclose( fp ); 111 return 0; 112}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/14 16:28