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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

Q&A

解決済

3回答

4795閲覧

リストの末尾要素を削除する関数が作れない

wanwanwan

総合スコア21

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

0グッド

0クリップ

投稿2016/10/26 13:25

編集2016/11/04 05:37
void List::removeLast() { // 実現できない関数!! if (head == NULL) return; Cell *p; for (p = head; (p->next)->next != NULL; p = p->next) Cell *removed = p->next; p->next = NULL; delete removed; } int main() { List l; l.addFirst(1); l.addFirst(2); l.addFirst(3); l.print(); l.removeFirst(); l.print(); l.addLast(4); l.print(); l.removeLast(); l.print(); return 0; }

理想の実行結果
321
21
214
21


リストの末尾要素を削除する関数が上手く定義できません。
どうすればよいでしょうか?
次のアドレスがNULLであるリストを削除して、その1つ前のリストの次のアドレスをNULLにすればよいことはわかっていますが、どう書いたらいいのかわかりません。

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

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

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

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

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

guest

回答3

0

一個だけ無駄なCellを(末尾要素として)入れとくって手もあります。
そうすれば末尾要素を削除することがなくなる。

投稿2016/10/27 00:33

episteme

総合スコア16614

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

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

0

自己解決

void List::removeLast() { if (head == NULL) return; Cell *p; for (p = head; (p->next)->next != NULL; p = p->next); // ;で解決!! Cell *removed = p->next; p->next = NULL; delete removed; }

for文に強引に区切りを付けたら解決しましたが、これは正しい使い方でしょうか?
つまり、for文で最後のリストを検索するだけで、"中身の処理は無し"という使い方は正攻法でしょうか?

しかしとりあえず解決しました。

投稿2016/10/26 13:52

wanwanwan

総合スコア21

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

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

HogeAnimalLover

2016/10/26 14:09

これだと要素数が一つのときエラーとなります。 条件:head != NULLかつhead->next ==NULLのとき エラー:(p->next)->nextを計算しようとしてNULL->nextとなってしまう。
HogeAnimalLover

2016/10/26 14:19

それをやるならばここも変える必要があります。 if (head == NULL)  return; ↓ if(head == NULL){  return; }else if(head->next == NULL){  delete head;  head = NULL;  return; }
guest

0

C++

1void List::removeLast() 2{ 3 if(head){ 4 for(Cell** pp = &head; (*pp)->next; pp = &( (*pp)->next) ){ 5 } 6 Cell *p = *pp; 7 *pp = NULL; 8 delete p; 9 } 10}

動作未確認

投稿2016/10/26 13:37

編集2016/10/26 13:40
HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問