使用STL
反转带有递归的链接列表的代码 #include<iostream>
#include<conio.h>
#include<list>
using namespace std;
template<typename T>
class node
{
public:
T data;
node<T> *next;
node(){ next = NULL; }
node(const T& item, node<T> *nextnode = NULL)
{
data = item;
next = nextnode;
}
};
template<typename T>
class Reverse_list
{
private:
node<T> *head;
void reverse(node<T> *front);
public:
Reverse_list(){ head = NULL; }
//template<typename T>
void Reverse();
template<typename T>
void Display( list<T>& alist );
};
int main()
{
Reverse_list <int> rl;
list<int> intlist;
int size, no;
cout << "Size of List ?? ";
cin >> size;
for (int i = 1; i <= size; i++)
{
cout << "Enter the " << i <<" "<< "element";
cin >> no;
intlist.push_front(no);
}
rl.Display(intlist);
rl.Reverse();
rl.Display(intlist);
_getch();
return 0;
}
template<typename T>
void Reverse_list<T>::Display(list<T>& alist)
{
list<int>::iterator iter = alist.begin();
while (iter != alist.end())
{
cout << *iter << " ";
iter++;
}
}
template<typename T>
void Reverse_list<T>::reverse(node<T> *front)
{
if (front->next == NULL)
{
head = front;
return;
}
reverse(front->next);
node<int> *back = front->next;
back->next = front;
front->next = NULL;
}
template<typename T>
void Reverse_list<T>::Reverse()
{
reverse(head);
}
上面的代码会产生2个错误。
错误1)没有函数模板的实例与参数列表匹配。 (没有错误编号。)
如果我删除第1行(在代码中提到),那么上面的错误就不再存在了。 (为什么?)
错误2)C2783:'void Reverse_list :: Reverse1(void)':无法推断'T'的模板参数
如何解决上述错误。
在上面的程序中,我想要传递“head”节点(私有)作为
反向函数的参数。但我们无法访问课外的私人成员。所以我间接通过了。这是一种正确的传递途径吗?或者还有其他一些访问私人数据的方法?
答案 0 :(得分:0)
我不确定你的意图,但......
您是否尝试在另一个方法(reverse()
)中声明方法(Reverse()
)? Uhmmm ....
我们稍后再回来。
想象一下,以下指令是Reverse_list<T>::Reverse()
node<T> *back = front->next;
为什么在为其分配back
(特定Node<T>
)时,将front->next
声明为指向通用Node<int>
的指针?
如果您将back
定义为node<int>
指针,则方法Reverse()
不再需要成为模板(取决于T
)方法。你可以避免这两个错误。
使用您的实际代码,当您致电
时rl.Reverse();
您调用模板方法,但编译器不知道如何确定类型T
。你可以用这种方式明确它
rl.Reverse<int>();
但是,如前所述,如果你删除整个模板部分,我会更好。
或者,您也可以在模板类中转换整个类;其中head
是指向通用Node<T>
的指针,而不是指定Node<int>
的指针。
类似的东西(如果我理解你的意图)
template <typename T>
class Reverse_list
{
private:
node<T> *head;
void reverse (node<T> * front);
public:
Reverse_list() : head(NULL)
{ }
void Reverse();
void Display(list<T>& alist);
};
template<typename T>
void Reverse_list<T>::reverse (node<T> * front)
{
if (front->next == NULL)
{
head = front;
return;
}
reverse(front->next);
node<T> *back = front->next;
back->next = front;
front->next = NULL;
}
template<typename T>
void Reverse_list<T>::Reverse()
{ reverse(head); }
在这种情况下,在main()
中,rl
应声明为
Reverse_list<int> rl;
将T
修改为int
,并且对Reverse()
的调用应为
rl.Reverse();
---编辑2016.05.10 ---
使用&#34;模板Reverse_list&#34;解决方案,你应该纠正三点(最后)。
1)在Reverse_list
类声明中,您在template<typename T>
之前评论了void Reverse()
行;好;你应该在void Display( list<T>& alist );
之前删除(评论)同一行(出于同样的原因);所以班级成为
template<typename T>
class Reverse_list
{
private:
node<T> *head;
void reverse(node<T> *front);
public:
Reverse_list(){ head = NULL; }
//template<typename T>
void Reverse();
//template<typename T>
void Display( list<T>& alist );
};
2)Display()
现在是模板类的方法;所以这一行
list<int>::iterator iter = alist.begin();
成为
list<T>::iterator iter = alist.begin();
3)reverse()
现在是模板类的方法;所以这一行
node<int> *back = front->next;
成为
node<T> *back = front->next;