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

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

新規登録して質問してみよう
ただいま回答率
86.12%
アルゴリズム

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

セグメンテーション違反

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

データ構造

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

連結リスト

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

連結リストを実装したいのですが、segmentation fault: 11と出てしまいます。

goro_gnm
goro_gnm

総合スコア42

アルゴリズム

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

セグメンテーション違反

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

データ構造

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

連結リスト

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0リアクション

0クリップ

452閲覧

投稿2019/06/13 12:44

前提・実現したいこと

以下の命令を受けつける双方向連結リストを実装したいです。

insert x: 連結リストの先頭にキー x を持つ要素を継ぎ足す。
delete x: キー x を持つ最初の要素を連結リストから削除する。そのような要素が存在しない場合は何もしない。
deleteFirst: リストの先頭の要素を削除する。
deleteLast: リストの末尾の要素を削除する。

以下入力例

7 insert 5 insert 2 insert 3 insert 1 delete 3 insert 6 delete 5

以下出力例

6 1 2

この機能の実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

以下の3行の入力後、segmentation fault: 11のメッセージが出てしまいます。何を改善したらこれはなくなるのでしょうか。

2 delete 2 insert 1 Segmentation fault: 11

該当のソースコード

c++

#include<cstdio> #include<cstdlib> #include<cstring> struct Node{ int key; Node *next, *prev; }; Node *nil; Node* listSearch(int key){ Node *cur = nil->next;// while(cur != nil && cur->key != key ){ cur = cur->next; } return cur; } void init() { nil = (Node *)malloc(sizeof(Node)); nil->next = nil; nil->prev = nil; } void insert(int key){ Node *x = (Node *)malloc(sizeof(Node)); x->next = nil->next; x->prev = nil; nil->next = x; nil->next->prev = x; } void deleteNode(Node *t){ if (t == nil) return; t->prev->next = t->next; t->next->prev = t->prev; free(t); } void deletefirst(){ deleteNode(nil->next); } void deletelast(){ deleteNode(nil->prev); } void deletekey(int key){ deleteNode(listSearch(key)); } void printlist(){ Node *cur = nil->next; int isf = 0; while(1){ if(cur == nil) break; if(isf++ > 0) printf(""); printf("%d", cur->key); cur = cur->next; } printf("\n"); } int main(){ int i, n, key; scanf("%d", &n); //int size = 0; //int np = 0, nd = 0; char com[20]; for(i=0;i<n;i++){ scanf("%s%d", com, &key); if(com[0] == 'i'){ insert(key); //np++; size++; } else if(com[0] == 'd'){ if(strlen(com) > 6) deletefirst(); else if(com[6] == 'F') deletelast(); }else{ deletekey(key); //nd++; } //size--; } printlist(); return 0; }

補足情報

AOJのアルゴリズムとデータ構造の問題です。
ALDS1_3_C: Doubly Linked List

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

アルゴリズム

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

セグメンテーション違反

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

データ構造

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

連結リスト

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。