前提・実現したいこと
以下の命令を受けつける双方向連結リストを実装したいです。
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++
1#include<cstdio> 2#include<cstdlib> 3#include<cstring> 4 5struct Node{ 6 int key; 7 Node *next, *prev; 8}; 9 10Node *nil; 11 12Node* listSearch(int key){ 13 Node *cur = nil->next;// 14 while(cur != nil && cur->key != key ){ 15 cur = cur->next; 16 } 17 return cur; 18} 19 20void init() { 21 nil = (Node *)malloc(sizeof(Node)); 22 nil->next = nil; 23 nil->prev = nil; 24} 25 26void insert(int key){ 27 Node *x = (Node *)malloc(sizeof(Node)); 28 x->next = nil->next; 29 x->prev = nil; 30 nil->next = x; 31 nil->next->prev = x; 32} 33 34void deleteNode(Node *t){ 35 if (t == nil) return; 36 t->prev->next = t->next; 37 t->next->prev = t->prev; 38 free(t); 39} 40 41void deletefirst(){ 42 deleteNode(nil->next); 43 } 44 45void deletelast(){ 46 deleteNode(nil->prev); 47} 48 49void deletekey(int key){ 50 deleteNode(listSearch(key)); 51} 52 53void printlist(){ 54 Node *cur = nil->next; 55 int isf = 0; 56 while(1){ 57 if(cur == nil) break; 58 if(isf++ > 0) printf(""); 59 printf("%d", cur->key); 60 cur = cur->next; 61 } 62 printf("\n"); 63} 64 65int main(){ 66 int i, n, key; 67 scanf("%d", &n); 68 //int size = 0; 69 //int np = 0, nd = 0; 70 char com[20]; 71 for(i=0;i<n;i++){ 72 scanf("%s%d", com, &key); 73 if(com[0] == 'i'){ insert(key); 74 //np++; size++; 75 } 76 else if(com[0] == 'd'){ 77 if(strlen(com) > 6) deletefirst(); 78 else if(com[6] == 'F') deletelast(); 79 }else{ 80 deletekey(key); //nd++; 81 } 82 //size--; 83 } 84 85 printlist(); 86 return 0; 87 88}
補足情報
AOJのアルゴリズムとデータ構造の問題です。
ALDS1_3_C: Doubly Linked List
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/13 13:06
2019/06/13 14:25
2019/06/13 14:48 編集
2019/06/13 14:28
2019/06/14 04:12
2019/06/14 04:16