我正在尝试为我的通用列表类提供反向功能。出于某种原因,当我测试它时,我的算法不起作用。我认为这是有意义的:将指针交换到列表的第一个和最后一个节点,然后遍历列表,并为每个节点交换其指向上一个和下一个节点的指针。
对我来说,伙计们。我正在尝试使用泛型编程。教我C ++纯粹主义者的方式。
这是交换功能:
template <class T> void swap(T* a, T* b) {
T* tempPtr = a;
a = b;
b = tempPtr;
}
这是反向功能:
template <class T> void List<T>::reverse() {
if (size > 1) {
swap(firstNodePtr, lastNodePtr);
node* curNodePtr = firstNodePtr;
while (curNodePtr != NULL) {
swap(curNodePtr->prevNodePtr, curNodePtr->nextNodePtr);
curNodePtr = curNodePtr->nextNodePtr;
}
}
}
这是类,它的成员和函数原型:
template <class T> class List {
public:
List();
~List();
void push_back(T);
void push_front(T);
T get_at(unsigned);
unsigned get_size();
void reverse();
private:
struct node {
T val;
node* prevNodePtr;
node* nextNodePtr;
};
node* firstNodePtr;
node* lastNodePtr;
unsigned size;
};
答案 0 :(得分:2)
您的swap<T>
函数不起作用:它交换指针,这些指针按值复制到函数的局部变量中,这对调用者没有影响。
删除您自己的swap
并将其替换为std::swap
将解决此问题。
答案 1 :(得分:1)
由于您按值传递了两个指针,因此对a
和b
的更改不会传播出swap()
函数,从而使其成为无操作。
修复它的一种方法是通过引用传递指针:
template <class T> void swap(T*& a, T*& b) {
或者(最好)只使用std::swap()
而不是你自己的功能。
答案 2 :(得分:0)
如果您公开了node
结构(或至少是列表的双向迭代器类型),则可以避免整个问题,只需使用std::reverse
。
List<int> someList;
// fill with data
std::reverse(someList.begin(), someList.end()); // where begin returns a bidirectional iterator for the head, and end returns a bidirectional iterator for 1 element beyond the tail