【发布时间】:2016-11-29 21:33:05
【问题描述】:
我正在研究旧考试以备考。一项任务是实现一个插入和打印函数,在循环列表的开头插入元素。提供了一个程序来测试学生的解决方案。
我对插入的解决方案是:
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->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;
};
我认为我的插入是错误的,但我不知道我做错了什么?
【问题讨论】:
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
所以您将
entry->next设置为tmp,但tmp的next是什么? -
您应该使用更少的测试数据。从 3 或 4 个元素开始,而不是 20 个。如果它不适用于 3 个元素,则无需尝试 20 来使事情复杂化——只需先将其修复为 3。
标签: c++ pointers circular-list