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

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

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

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

Q&A

解決済

3回答

558閲覧

c++での双方向リストの作成

chibi_96_

総合スコア8

C++

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

0グッド

0クリップ

投稿2018/06/17 18:35

前提・実現したいこと

c++で双方向リストを作成したいです

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

末尾にうまく値を挿入できない

該当のソースコード

C++

1#include <cstdlib> 2 class BidirectionalCell{ 3 public: 4 int value; 5 6BidirectionalCell* forward; 7 BidirectionalCell* backward; 8 BidirectionalCell(int val= 0): value(val), 9 forward(NULL), backward(NULL) {} 10 }; 11 12 13 #include "BidirectionalCell.h" 14 #include <cstdlib> 15 #include <string> 16 class BidirectionalList{ 17 private: 18 BidirectionalCell* top; 19 BidirectionalCell* tail; 20 public: 21 BidirectionalList(): 22 top(NULL), tail(NULL) {} 23 void pushTop(int value); 24 void pushTail(int value); 25 std::string toString() const; 26 }; 27 28 #include "BidirectionalList.h" 29 #include <iostream> 30 using namespace std; 31 int main() { 32 BidirectionalList* list = new BidirectionalList(); 33 list->pushTop(1); 34 list->pushTail(2); 35 list->pushTop(3); 36 list->pushTail(9); 37 list->pushTail(10); 38 cout<< "list = " << list->toString() << endl; 39 } 40

試したこと

pushtopというメンバ関数内に
BidirectionalCell* tmp = new BidirectionalCell(value);
tmp->forward = top;
top = tmp;
というコードを書いたら先頭に値が入るようになりました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

提示されたコードを使用するとこんな感じでしょうか。

BidirectianlCell.h

c++

1#include <cstdlib> 2 3class BidirectionalCell{ 4public: 5 int value; 6 7 BidirectionalCell* forward; 8 BidirectionalCell* backward; 9 BidirectionalCell(int val= 0): value(val),forward(NULL), backward(NULL) {} 10 }; 11 12

BidirectianlList.h

c++

1#include "BidirectionalCell.h" 2#include <cstdlib> 3#include <string> 4class BidirectionalList{ 5private: 6 BidirectionalCell* _top; 7 BidirectionalCell* _tail; 8public: 9 BidirectionalList():_top(NULL), _tail(NULL) {} 10 void pushTop(int value){ 11 BidirectionalCell* cell = new BidirectionalCell(value); 12 if( _top==NULL && _tail==NULL){ 13 _top = _tail = cell; 14 } 15 else{ 16 cell->forward = _top; 17 _top->backward = cell; 18 _top = cell; 19 20 } 21 } 22 void pushTail(int value){ 23 BidirectionalCell* cell = new BidirectionalCell(value); 24 if( _top==NULL && _tail==NULL){ 25 _top = _tail = cell; 26 } 27 else{ 28 cell->backward = _tail; 29 _tail->forward = cell; 30 _tail = cell; 31 } 32 } 33 std::string toString() const { 34 std::string str; 35 BidirectionalCell* p = _top; 36 while(p!=NULL){ 37 str = str + " " + std::to_string(p->value); 38 p = p->forward; 39 } 40 return str; 41 } 42}; 43

main.cpp

c++

1 2 3 #include "BidirectionalList.h" 4 #include <iostream> 5 using namespace std; 6 int main() { 7 BidirectionalList* list = new BidirectionalList(); 8 list->pushTop(1); 9 list->pushTail(2); 10 list->pushTop(3); 11 list->pushTail(9); 12 list->pushTail(10); 13 cout<< "list = " << list->toString() << endl; 14}

実行結果

$ g++ -std=c++11 main.cpp $ ./a.out list = 3 1 2 9 10

投稿2018/06/18 15:23

tatamyiwathy

総合スコア1039

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

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

chibi_96_

2018/06/22 05:43

ありがとうございます もっと勉強します
guest

0

わざわざ独自実装しないでもSTL使えばいい

c++

1#include <iostream> 2#include <list> 3using std::cout, std::endl; 4using std::list; 5 6int main(void) { 7 list<int> list; 8 9 list.push_front(1); 10 list.push_back(2); 11 list.push_front(3); 12 list.push_back(9); 13 list.push_back(10); 14 15 cout << "list = ["; 16 auto b = std::cbegin(list); 17 auto e = std::cend(list); 18 cout << *b++; 19 for(; b != e; ++b) 20 cout << "," << *b; 21 cout << "]" << endl; 22 // => list = [3,1,2,9,10] 23}

投稿2018/06/18 01:02

asm

総合スコア15147

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

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

0

課題かなにかだと思いますが、いきなりコード化するのではなく、
・どのセルがどこと繋がっているか
・topとtailはどこを指しているか
といった事を紙に書きながらやると良いと思います。

pushtopというメンバ関数内に
BidirectionalCell* tmp = new BidirectionalCell(value);
tmp->forward = top;
top = tmp;
というコードを書いたら先頭に値が入るようになりました。

空のリストに対してpushtopしたらtailはどこを指すべきでしょうか?
(現在はおそらくNULLのままですよね。)

また、

末尾にうまく値を挿入できない

ということであれば試したpushtailのコードも示してください。

投稿2018/06/18 00:31

編集2018/06/18 00:32
takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問