2016-11-29 11 views
-1

私は試験のために古い試験を勉強しています。 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; 
    } 
} 

私の思考プロセス: 動作するようですenter image description here

私の印刷理由:正しい順序で

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; 
    }; 

が、私は私の挿入が間違っていると仮定しますが、私は私が間違ってやっているかを把握することはできませんか?

+2

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+1

'entry-> next'を' tmp'に設定していますが、 'tmp'の' next'は何ですか? – CompuChip

+0

テストデータはずっと少なくする必要があります。 3つの要素で動作しない場合は、20を試して複雑にする必要はありません。最初に3つの要素を修正してください。 – PaulMcKenzie

答えて

2

リストに2番目の要素を挿入すると、最初の要素は次のエントリを保持しています。次の2つのフィールドを更新する必要があります.1つは挿入されたレコードで、もう1つは挿入されたレコードを指すフィールドです。あなたは後者をやっていません。 else節は、おそらく次のようになります。

Element* temp = new Element(str); 
    temp->next = entry->next; 
    entry->next = temp; 
    entry = temp; 

これが最後のサイクルの要素とエントリー・>次へのポインタエントリを作成します - 最初のサイクルの要素;

ところで、次の図面は 'a' - > nextが 'a'を指し、エントリではないので間違っています。

関連する問題