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

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

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

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

Q&A

解決済

1回答

2048閲覧

C++ 自作双方向連結リストの削除だけ出来ない (AOJ:ALDS1_3_C)

opyon

総合スコア1009

C++

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

0グッド

0クリップ

投稿2018/11/05 09:38

編集2018/11/05 10:15

解決!
@asmさんの回答どおりfor(){};としてif(){}文全体を外に出したらうまくいきました。
ありがとうございました。

C++

1 void delete_find(unsigned long long &key) 2 { 3 Node *node; 4 for (node = top->next; node != top && node->key != key; node = node->next) 5 { 6 }; 7 8 if (node != top && node->key == key) 9 { 10 node->prev->next = node->next; 11 node->next->prev = node->prev; 12 delete node; 13 } 14 } 15

AOJの問題:ALDS1_3_C:双方向連結リスト

###知りたいこと
delete_findメソッド(要素の削除)のどこが間違っているのか知りたいです。

動的メモリ操作の実装は初めてなので初歩的なミスかもしれません。
アドバイスなどご教示頂けると助かります。

###現状
上記問題のヒントや公開されている解答を参考(ほぼ写経)に自作リストを作りました。
初期化と挿入とリスト出力と先頭削除と末尾削除は出来ましたが、
delete_findメソッドの削除だけ正常動作出来ていないようです。

###サンプルコード

C++

1#include <bits/stdc++.h> 2 3struct MyList 4{ 5 struct Node 6 { 7 unsigned long long key; 8 struct Node *next, *prev; 9 }; 10 11 Node *top; 12 13 MyList() 14 { 15 this->init(); 16 } 17 18 void init() 19 { 20 top = new Node; 21 top->next = top->prev = top; 22 } 23 24 void print_list() 25 { 26 for (Node *node = top->next; node != top; node = node->next) 27 { 28 if (node != top->next) 29 { 30 std::cout << ' '; 31 } 32 std::cout << node->key; 33 } 34 std::cout << std::endl; 35 } 36 37 void insert(unsigned long long &key) 38 { 39 Node *node = new Node; 40 node->key = key; 41 node->next = top->next; 42 top->next->prev = node; 43 top->next = node; 44 node->prev = top; 45 } 46 47 void delete_find(unsigned long long &key) 48 { 49 Node *node; 50 for (node = top->next; node != top && node->key != key; node = node->next) 51 { 52 if (node != top && node->key == key) 53 { 54 node->prev->next = node->next; 55 node->next->prev = node->prev; 56 delete node; 57 } 58 } 59 } 60 61 void delete_first() 62 { 63 Node *node = top->next; 64 top->next = top->next->next; 65 top->next->prev = top; 66 delete node; 67 } 68 void delete_last() 69 { 70 Node *node = top->prev; 71 top->prev = top->prev->prev; 72 top->prev->next = top; 73 delete node; 74 } 75}; 76 77void alds1_3_3() 78{ 79 unsigned long long n, v; 80 MyList mylist; 81 std::string str; 82 83 std::cin >> n; 84 for (int i = 0; i < n; ++i) 85 { 86 std::cin >> str; 87 if (str == "insert") 88 { 89 std::cin >> v; 90 mylist.insert(v); 91 } 92 else if (str == "delete") 93 { 94 std::cin >> v; 95 mylist.delete_find(v); 96 } 97 else if (str == "deleteFirst") 98 { 99 mylist.delete_first(); 100 } 101 else 102 { 103 mylist.delete_last(); 104 } 105 } 106 mylist.print_list(); 107} 108 109int main() 110{ 111 alds1_3_3(); 112 getchar(); 113 return 0; 114} 115

入力

9 insert 5 insert 2 insert 3 insert 1 delete 3 insert 6 delete 5 deleteFirst deleteLast

期待する出力

1

※現状の間違った出力

1 3 2

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1 void delete_find(unsigned long long &key) 2 { 3 Node *node; 4 for (node = top->next; node != top && node->key != key; node = node->next) 5 { 6 if (node != top && node->key == key) 7 { 8 node->prev->next = node->next; 9 node->next->prev = node->prev; 10 delete node; 11 } 12 } 13 }
for (node = top->next; node != top && node->key != key; node = node->next)

node->key != keyが継続条件なのでキーが合致した瞬間にfor文から脱出します。

冗談みたいな話ですが、forの末尾に;付けると動きますね

投稿2018/11/05 09:58

asm

総合スコア15147

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

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

opyon

2018/11/05 10:15 編集

回答ありがとうございます。 写経ミスでした。 確かに冗談みたいな話ですが、末尾に;でした。^^; こんな記述方法があると知らなかったので勝手にfor(){}の中にif(){}文を内包してしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問