我正在尝试实施单链表。我得到'Node'没有在第8行和第15行命名类型。同样在第33和34行,我得到第一个,最后一个未在此范围内声明。这可能是Node无法识别的结果。
#include <iostream>
template <typename T>
class Linked_List {
public:
Linked_List();
void print_list();
Node* find_kth(int k); // Line 8
void insert_front(T d);
void insert_back(T d);
void delete_front();
void delete_back();
private:
int length;
Node* first, last; // Line 15
class Node {
public:
Node(Node* n = NULL, T d = T{});
private:
Node* next;
int data;
};
};
template <typename T>
typename Linked_List<T>::Node(Node* n, T d) {
next = n;
data = d;
}
template <typename T>
Linked_List<T>::Linked_List() {
first = NULL; // Line 33
last = NULL; // Line 34
length = 0;
}
template <typename T>
void Linked_List<T>::print_list() {
Node* temp = first;
if (length > 0) {
std::cout << first->data << std::endl;
}
for (int i = 1; i < length; ++i) {
temp = temp->next;
std::cout << temp->data << std::endl;
}
}
template <typename T>
void Linked_List<T>::insert_front(T d) {
Node* new_node = new Node{first, d};
Node* temp = new_node;
first = temp;
}
int main() {
Linked_List<int> l_l;
//l_l.insert_front(10);
// l_l.print_list();
return 0;
}
答案 0 :(得分:1)
最后两个错误是前两个错误的结果,一旦你解决它们就会消失。前两个错误是因为您在声明之前引用了符号Node
。
此外,您实现Node
的构造函数的方式不正确。
class Linked_List {
class Node { // <-- move it here
public:
Node(Node* n = NULL, T d = T{});
private:
Node* next;
int data;
};
public:
Linked_List();
void print_list();
Node* find_kth(int k);
void insert_front(T d);
void insert_back(T d);
void delete_front();
void delete_back();
private:
int length;
Node* first, last;
};
你试图在类的正文之外实现的Node
的构造函数应该是这样的:
template <typename T>
Linked_List<T>::Node::Node(Node* n, T d) {
next = n;
data = d;
}
正如您在此处看到的,Linked_List<T>::Node
是类的名称,然后第二个Node
是构造函数的名称,内部Node
是参数的类型,但在后者中我们不知道不必再说Linked_List<T>::Node
了,因为名称的范围已经确定。