前提・実現したいこと
タイトルの通り双方向リストを作りたいです。
大まかな全体図はあるのですが、関数の中身をどう書けばいいのかわからなかったり、うまく動作しなかったりします。可能なら動くコードを提示してくださると、とてもありがたいです。
発生している問題・エラーメッセージ
現段階では、コンパイルエラーはありませんが、想定通りに動きません。
該当のソースコード
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
なんで作らにゃならんのですか? std::list ではダメなん?
質問文の中に質問がありません。
動くコードにして提示すればいいのでしょうか?
それとも練習でやっているから助言が欲しいということでしょうか?
このレベルの歯抜けコードだと助言をするにしてもどこをどうすれば出来るという単純な答えにはし難いです。
質問がわかりにくくてすみません。
課題の一環として簡易版を作れと言われたのですが、途中まで書いて行き詰ってしまったので質問させていただきました。もし可能なら、動くコードを提示してくださると助かりますが、時間がない場合は助言でもしてくださると助かります。
コードが欲しいというのは Teratail としては推奨していません。
https://teratail.com/help/avoid-asking
ピンポイントにここがわからないというところまで具体的になっているのならばともかく、あまりにも歯抜けすぎて実質的に代わりに課題を解いて欲しいという要求になっています。
説明のためにコードで示す場合はありますが、代わりにやるのは Teratail 的ではありません。
初心者に助言をする方がコードを書くよりずっとずっとずっと大変なんです。
繰り返しますが、あまりに歯抜け過ぎてどこをどうすれば出来るとは言えません。
何がわかってないから出来ないのかもう一度よく考え直して質問を具体的にしてください。
回答1件
あなたの回答
tips
プレビュー