質問編集履歴

1 タイトル修正

Leeee

Leeee score 1

2020/05/30 15:25  投稿

C言語で連結リストの探索・挿入する
C言語で連結リストの探索・挿入する問題でsegmentation faultが出る
### 前提・実現したいこと
0以上n未満の範囲の整数の一様乱数をn個発生させ,発生させたn個の乱数を(リストが空の状態1から) 順に関数 insert_data() を用いて登録する際の計算量(のオーダ)について考察する、という問題なのですが、segmentation faultが出てしまいます。
0以上n未満の範囲の整数の一様乱数をn個発生させ,発生させたn個の乱数を(リストが空の状態から) 順に関数 insert_data() を用いて登録する際の計算量(のオーダ)について考察する、という問題なのですが、segmentation faultが出てしまいます。
insert_data()はリストを先頭セル(head が指すセル)から順にたどりながら,セルのデータと与えら れた整数データ d を比較し,d 以下の値が初めて見つかったセルの直前に整数データ d を格納し たセルを挿入する.また, そのようなセルが最後まで見つからなかった場合には, リストの末尾 に整数データ d を格納したセルを挿入するというものです。
何が原因になっているかわかりません。また、関数の実装に誤りがありましたら、そちらも教えていただきたいです。
### 発生している問題・エラーメッセージ
```
zsh: segmentation fault ./main
```
### 該当のソースコード
```C
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
typedef struct _cell {
 int data;
 struct _cell *next;
} CELL;
CELL *head;
void insert_cell(CELL *p, int d){
 CELL *new_cell;
 new_cell = (CELL *)malloc(sizeof(CELL));
 new_cell->data = d;
 new_cell->next = p->next;
 p->next = new_cell;
}
void insert_cell_top(int d) {
 CELL *new_cell;
 new_cell = (CELL *)malloc(sizeof(CELL));
 new_cell->data = d;
 new_cell->next = head;
 head = new_cell;
}
void insert_data(int d) {
 CELL *p;
 p = (CELL *)malloc(sizeof(CELL));
 head->next = p;
 if(head->data <= d || head==NULL){
   insert_cell_top(d);
 } else {
   while(p!=NULL){
     if(p->data <= d){
       insert_cell(p,d);
       break;
     } else if(p->next==NULL){
       insert_cell(p,d);
       break;
     }
     p=p->next;
   }
 }
}
int main(void) {
 clock_t start, end;
 int i,n;
 head=NULL;
 for(i=0;i<100;i++){
   n = (double)rand() / ((double)RAND_MAX + 1.0) * 10000.0;
   start = clock();
   insert_data(n);
   end = clock();
   printf("%f\n",(double)(end-start)/CLOCKS_PER_SEC);
 }
 
 return 0;
}
```
### 補足情報(FW/ツールのバージョンなど)
MacOS
  • C

    8485 questions

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

  • アルゴリズム

    1197 questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

  • データ構造

    608 questions

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

  • 連結リスト

    62 questions

    連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る