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

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

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

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

セグメンテーション違反

セグメンテーション違反とは、ソフトウェア実行時に発生するエラーのひとつであり、許可されていないメモリにアクセスしたときに起きます。しばしば、ポインタの不適切な使用、またはバッファオーバーフローによって起こります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

4244閲覧

c言語 リスト構造への追加

tamintya

総合スコア34

C

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

セグメンテーション違反

セグメンテーション違反とは、ソフトウェア実行時に発生するエラーのひとつであり、許可されていないメモリにアクセスしたときに起きます。しばしば、ポインタの不適切な使用、またはバッファオーバーフローによって起こります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/05/14 15:19

リスト構造への追加

画面から場所とデータを入力し、リスト構造にデータを追加するプログラムを作りました。
しかしコンパイルは通ったのですが実行するとセグメンテーション違反と表示されてしまいます。
どこがおかしいのでしょうか。教えて欲しいです。
よろしくおねがいします。

該当のソースコード

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}

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

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

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

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

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

guest

回答1

0

ベストアンサー

temp->nextでNULLポインタを逆参照しています

C

1 r->next = NULL; 2// 中略 3 for (i = 0; i <= place - 1; i++) { 4 if (i == 0) { 5 temp = listhead; 6 temp = r; // tempにrを代入(つまりtemp->nextはNULL) 7 listtail = r; 8 } 9 temp = temp->next; // 1周目でtempはNULL、placeが2以上の場合は2周目でNULLポインタを逆参照 10 } 11 r->next = temp->next; // placeが1の場合はここでNULLポインタを逆参照 12 }

投稿2021/05/14 16:08

編集2021/05/14 16:38
SHOMI

総合スコア4079

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

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

tamintya

2021/05/14 16:28

理解することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問