“节点”未指定类型链接列表

时间:2017-03-18 01:14:00

标签: c++ linked-list

我正在尝试实施单链表。我得到'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;
}

1 个答案:

答案 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了,因为名称的范围已经确定。