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

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

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

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

Q&A

解決済

1回答

1176閲覧

C++で簡易版双方向リストを作りたい

do_Shiro_to

総合スコア15

C++

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

0グッド

0クリップ

投稿2020/03/01 07:30

編集2020/03/01 21:48

前提・実現したいこと

タイトルの通り双方向リストを作りたいです。
大まかな全体図はあるのですが、関数の中身をどう書けばいいのかわからなかったり、うまく動作しなかったりします。可能なら動くコードを提示してくださると、とてもありがたいです。

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

現段階では、コンパイルエラーはありませんが、想定通りに動きません。

該当のソースコード

h. ファイル

C++

1template <typename T> 2class List 3{ 4 struct ListNode 5 { 6 Node() 7 { 8 Prev = nullptr; 9 Next = nullptr; 10 } 11 T Data; 12 Node* Prev; 13 Node* Next; 14 }; 15 16 Node* Head; 17 Node* Tail; 18 T Undefined; 19 20public: 21 List() 22 { 23 Head = new Node; 24 Tail = new Node; 25 Head->Next = Tail; 26 Head->Prev = nullptr; 27 Tail->Prev = Head; 28 Tail->Next = nullptr; 29 } 30 List(const List& Other) : List() 31 { 32      //コピーコンストラクタ 33 } 34 List& operator = (const List& RHS) 35 { 36      //代入演算子 37 } 38 ~List() 39 { 40      //デストラクタ 41 } 42 43 void AddFront(const T& What)   //先頭に要素を追加する 44 { 45 Node* Temp = new Node; 46 Temp->Data = What; 47 48 if (Head == nullptr) 49 { 50 Temp->Next = nullptr; 51 Tail = Temp; 52 } 53 else 54 { 55 Temp->Next = Head; 56 Head = Temp; 57 } 58 } 59 void DeleteFront() 60 { 61       //先頭の要素を削除する 62 } 63 T& Front() 64 { 65     //先頭の要素にアクセスして、その値を返す。もしHeadがnullptrなら下のUndefinedを返す 66 return Undefined; 67 } 68 69 void AddBack(const T& tWhat)   //リストの末尾に要素を追加する 70 { 71 Node* Temp = new Node; 72 Temp->Data = What; 73 Temp->Next = nullptr; 74 75 if (Head == nullptr) 76 { 77 Head = Temp; 78 Tail = Temp; 79 } 80 else 81 { 82 Tail->Next = Temp; 83 Tail = Temp; 84 } 85 86 Tail->Next = nullptr; 87 88 } 89 void DeleteBack() 90 { 91     //末尾の要素を削除する 92 } 93 T& Back() 94 { 95    //末尾の要素を返す。もしTailがnullptrなら下記の通り。 96 return Undefined; 97 } 98 99 int Size() const   //リスト内の要素の数を返す 100 { 101 int Size = 0; 102 Node* Temp = new Node; 103 Temp = Head; 104 while ( Temp != Tail ) 105 { 106 Size++; 107 Temp = Temp->Next; 108 } 109 110 return Size; 111 } 112 void Clear() 113 { 114    //リストを初期化する 115 } 116 117 T& At(int tWhere) const 118 { 119     //指定された箇所にある要素を返す。 120 } 121 122};

C++

1#include <iostream> 2#include "List.h" 3 4using namespace std; 5 6int main() 7{ 8 List<int> ListA; 9 10 ListA.AddBack(1); 11 ListA.AddBack(3); 12 ListA.AddFront(4); 13 ListA.AddFront(5); 14 15 List<int> ListB = ListA; 16 17 ListB.DeleteBack(); 18 19 cout << "4になるはず: " << ListA.Size() << endl; 20 cout << "3になるはず: " << ListB.Size() << endl; 21 cout << "5になるはず: " << ListA.Front() << endl; 22 cout << "3になるはず: " << ListA.Back() << endl; 23 24 return 0; 25} 26

開発環境

Visual Studio 2019 ver.16.0,2

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

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

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

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

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

episteme

2020/03/01 08:29

なんで作らにゃならんのですか? std::list ではダメなん?
SaitoAtsushi

2020/03/01 11:45

質問文の中に質問がありません。 動くコードにして提示すればいいのでしょうか? それとも練習でやっているから助言が欲しいということでしょうか? このレベルの歯抜けコードだと助言をするにしてもどこをどうすれば出来るという単純な答えにはし難いです。
do_Shiro_to

2020/03/01 21:46

質問がわかりにくくてすみません。 課題の一環として簡易版を作れと言われたのですが、途中まで書いて行き詰ってしまったので質問させていただきました。もし可能なら、動くコードを提示してくださると助かりますが、時間がない場合は助言でもしてくださると助かります。
SaitoAtsushi

2020/03/02 01:22

コードが欲しいというのは Teratail としては推奨していません。 https://teratail.com/help/avoid-asking ピンポイントにここがわからないというところまで具体的になっているのならばともかく、あまりにも歯抜けすぎて実質的に代わりに課題を解いて欲しいという要求になっています。 説明のためにコードで示す場合はありますが、代わりにやるのは Teratail 的ではありません。 初心者に助言をする方がコードを書くよりずっとずっとずっと大変なんです。 繰り返しますが、あまりに歯抜け過ぎてどこをどうすれば出来るとは言えません。 何がわかってないから出来ないのかもう一度よく考え直して質問を具体的にしてください。
guest

回答1

0

ベストアンサー

AddFront が途中までかけてるんで、そこから完璧にしましょう

まず、最初はこうなってます
Head->Next = Tail;
Head->Prev = nullptr;
Tail->Prev = Head;
Tail->Next = nullptr;

ここにAddFront(A) としてNodeAを追加します

Head->Next = ???;
Head->Prev = ???;
Tail->Prev = ???;
Tail->Next = ???;
NodeA->Next = ???; // Head->Next と同じはず
NodeA->Prev = ???; // Head->Prev と同じはず

??? に当てはまるものを考えてください
できたら、そのとおりの値にセットされるのかプログラムを確認してみてください

#Head、Tailにはもっと適切な型があるかもしれません

投稿2020/03/02 03:08

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問