我正在尝试通过链表节点迭代器进行迭代。该代码在编译中未显示任何错误,但是,不会打印放置在链接列表节点中的数据。这是代码。
#pragma once
using namespace std;
template <class T>
class ListNode {
public:
T fData;
ListNode* fNext;
ListNode(const T& aData, ListNode* aNext = (ListNode*)0) {
fData = aData;
fNext = aNext;
}
};
用于实例化节点的ListNodeTemplate。
#pragma once
#include "ListNodeTemplate.h"
using namespace std;
template <class T>
class ListNodeIterator
{
private:
ListNode<T>* fNode;
public:
typedef ListNodeIterator<T> Iterator;
ListNodeIterator(ListNode<T>* aNode);
const T& operator*() const;
Iterator& operator++();
Iterator operator++(int);
bool operator==(const Iterator& aOther) const;
bool operator!=(const Iterator& aOther) const;
Iterator end();
};
ListNodeIterator头文件,您可以看到ListNodeTemplate包含在迭代器的头文件中。
#include "pch.h"
#include "ListNodeIterator.h"
using namespace std;
template <class T>
ListNodeIterator<T>::ListNodeIterator(ListNode<T>* aNode) {
fNode = aNode;
}
template <class T>
const T& ListNodeIterator<T>::operator*() const {
return fNode->fData;
}
template <class T>
typename ListNodeIterator<T>::Iterator& ListNodeIterator<T>::operator++() { //prefix
fNode = fNode->fNext;
return *this;
}
template <class T>
typename ListNodeIterator<T>::Iterator ListNodeIterator<T>::operator++(int) { //postfix
ListNodeIterator<T> temp = *this;
fNode = fNode->fNext;
return temp;
}
template <class T>
bool ListNodeIterator<T>::operator==(const Iterator& aOther) const {
return (fNode == aOther.fNode);
}
template <class T>
bool ListNodeIterator<T>::operator!=(const Iterator& aOther) const {
return !(*this == aOther.fNode);
}
template <class T>
typename ListNodeIterator<T>::Iterator ListNodeIterator<T>::end() {
return *this = nullptr;
}
到目前为止,我确定的是postfix运算符似乎没有迭代链接列表节点。编译器未显示任何编译错误。
这是main.cpp
#include "pch.h"
#include <iostream>
#include "ListNodeIterator.cpp"
using namespace std;
int main()
{
typedef ListNode<int> IntegerNode;
IntegerNode One(1);
IntegerNode Two(2, &One);
IntegerNode Three(3, &Two);
for (ListNodeIterator<int> iter(&Three); iter != iter.end(); ++iter) {
cout << "Value " << *iter << endl;
}
system("pause");
return 0;
}
到目前为止,它什么都不打印。
我的预期输出是:
Value 3
Value 2
Value 1
关于此问题是什么以及如何加以改善的任何建议?
答案 0 :(得分:1)
我只看了一下。稍后我可以更详细地查看,但是我注意到有两件事有待确认,但是一旦阅读,您可能会立即看到:
1)我认为您按以下顺序实例化了列表对象:1-> 2->3。因此,如果从3开始迭代器,则没有下一个节点。
2)看来您的Iterator类有一个end()函数很奇怪。这通常是容器会知道的东西。我认为迭代器不应该对容器的其余部分有任何了解。同样在end()中,将* this分配给nullputr可能会清除所有内容,因此当您尝试打印时,没有任何内容可以打印。