C ++中的循环链表(开头插入)

时间:2016-11-29 21:33:05

标签: c++ pointers circular-list

我正在学习考试的旧考试。一个任务是实现插入和打印功能,在圆形列表的开头插入元素。提供了一个程序来测试学生的解决方案。

我对插入的解决方案是:

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-&GT; C-&GT; B-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT的α-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT; A-&GT;

这似乎非常关闭,如果它不循环到列表的前面而不是只打印一个?

测试程序:

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

我认为我的插入错了,但我无法弄清楚我做错了什么?

1 个答案:

答案 0 :(得分:2)

当您将第二个元素插入列表时,您的第一个元素会使下一个条目返回指向自身。您需要更新两个下一个字段:一个在插入的记录中,另一个在列表中指向插入的记录。你没有做到后者。 else子句应该是:

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

这使得条目成为指向LAST循环元素和entry-&gt; next的指针 - 第一个循环元素;

顺便说一下,你的第二张图不正确,因为'a' - &gt;接下来应该指向'a'而不是进入。