私は試験のために古い試験を勉強しています。 1つのタスクは、循環リストの先頭に要素を挿入する挿入機能と印刷機能を実装することです。生徒の解答をテストするためのプログラムが提供されています。C++での循環リンクリスト(最初に挿入)
挿入のための私のソリューションは、次のとおりです。
void Circular_List::insert(std::string const& str)
{
if (entry == nullptr) {
entry = new Element(str);
entry -> next = entry;
}
else {
Element* temp = entry;
entry = new Element(str);
entry -> next = temp;
}
}
私の印刷理由:正しい順序で
void Circular_List::print() const
{
Element* temp = entry;
while (temp -> next != temp) {
cout << temp -> name << endl;
temp = temp -> next;
}
}
プリントリスト私が最初に追加した要素を除いて。私はなぜそれが最初の要素を印刷しないのか分かりません。 提供されたプログラムは20回の反復を印刷します。たとえば、a、b、c、d、eを挿入すると、プログラムが印刷されます。
d-> c-> b-> a-> a-> a-> a-> a- a> a> a> a> a> a> a>>
単に印刷するのではなく、リストの先頭に?
テストプログラム:
int j = 0;
for (Circular_List::Iterator i = l.begin(); i != l.end() && j < 20; ++i, ++j)
{
cout << *i << "->";
}
cout << endl;
class Iterator
{
public:
Iterator(Element* e) : pos(e) {}
~Iterator() = default;
Iterator(Iterator const&) = default;
Iterator& operator=(Iterator const&) = default;
bool operator!=(Iterator const& i) { return pos != i.pos; }
operator bool() { return pos != nullptr; }
Iterator& operator++() { pos = pos->next; return *this;}
std::string operator*() { return pos->name; }
private:
Element* pos;
};
が、私は私の挿入が間違っていると仮定しますが、私は私が間違ってやっているかを把握することはできませんか?
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
'entry-> next'を' tmp'に設定していますが、 'tmp'の' next'は何ですか? – CompuChip
テストデータはずっと少なくする必要があります。 3つの要素で動作しない場合は、20を試して複雑にする必要はありません。最初に3つの要素を修正してください。 – PaulMcKenzie