似乎无法将我的头文件与链表中的 cpp 文件连接起来

cant seem to connect my header file with my cpp file in linked list

假设定义和库正常工作,即。 <iostream><cassert>#define__NODE_H__、等等

问题是:如何在头部插入节点(第 1 部分)并在头部插入数据(第 2 部分)?

我的头文件(第 1 部分):

class Node {
     public:
         typedef int nodeDatatype;

         Node(
             const nodeDatatype& initData = nodeDatatype(),
             Node* initLink = NULL)
         {data = initData; link = initLink;}

         void setData(const nodeDatatype& new_data) {data = new_data;}
         void setLink(Node* new_link)               {link = new_link;}

         nodeDatatype getData() const {return data;}

         const Node*  getLink() const {return link;}
               Node*  getLink()       {return link;}

     private:
         nodeDatatype data;
         Node* link;
};
void insertHead(Node*& head, Node*& entry);

我的实现文件函数(一):

Node* insertHead(Node *head, Node *entry){
     Node* newNode = entry;
     newNode->setData = setData;
     newNode -> next = NULL;
     if(head == NULL){
         head = newNode;
     }
     else{
         newNode->next = head;
         head = newNode;
     }
     return head;
     }

这是正确的吗?或者我想添加一个 Node::Node* 范围?

对于第 2 部分,我可以只使用与在头部插入节点相同的功能插入数据吗?还是需要分开?

我得到的错误:

not being declared in scope

在我看来这些要求是

之外的要求
void insertHead(Node*& head, Node*& entry);

你需要

void insertHead(Node*& head, const Node::nodeDatatype & data);

避免复制 data 的参考(对于 int 有点毫无意义,但 typedef 可以更改为更强大的东西)和 const 因为insertHead没有修改数据的业务。 const 还允许函数接受更广泛的变量类型。

这个 insertHead 重载必须构造一个 Node 来保存数据,然后可以调用接受 insertHeadNode。例如:

void insertHead(Node*& head, const Node::nodeDatatype & data)
{
    Node * newNode = new Node(data);
    insertHead(head, newNode);
} 

这一切都基于

void insertHead(Node*& head, Node*& entry);

正在正确实施,目前还没有。让我们修复它,因为修复非常简单。

Node* insertHead(Node *head, Node *entry){

与声明不符。使用

void insertHead(Node*& head, Node*& entry){

代替。该函数的其余部分主要执行您想要的操作,但以非常迂回的方式执行。

     Node* newNode = entry;

不需要。它不会造成任何伤害,但无论如何让我们把它拆掉并一直使用 entry。

     newNode->setData = setData;

什么是setData?节点中已有的数据有什么问题?

     newNode-> next = NULL;
     if(head == NULL){
         head = entry;
     }
     else{
         newNode->next = head;
         head = newNode;
     }

以上大部分都不需要。新节点在head前面,所以不需要测试head是否为null,只需将新节点的next指向与[=34=相同的地方即可].换句话说,总是做 else 情况。

     return head;

这曾经是有道理的,但现在在匹配定义和声明之后。不要 return 来自 void 函数的值。

}

我们结束了

void insertHead(Node*& head, Node*& entry){
    entry->next = head; 
    head = entry; 
}

我们得到所有这些,

class Node {
     public:
         typedef int nodeDatatype;

         Node(
             const nodeDatatype& initData = nodeDatatype(),
             Node* initLink = NULL)
         {data = initData; link = initLink;}

         void setData(const nodeDatatype& new_data) {data = new_data;}
         void setLink(Node* new_link)               {link = new_link;}

         nodeDatatype getData() const {return data;}

         const Node*  getLink() const {return link;}
               Node*  getLink()       {return link;}

     private:
         nodeDatatype data;
         Node* link;
};
void insertHead(Node*& head, Node*& entry);
void insertHead(Node*& head, const Node::nodeDatatype & data);

然后是实现

void insertHead(Node*& head, Node*& entry){
    entry->link = head; // this line is currently impossible due to link being private
                        // perhaps these functions should be reworked into members
    head = entry; 
}
void insertHead(Node*& head, const Node::nodeDatatype & data)
{
    Node * newNode = new Node(data);
    insertHead(head, newNode);
} 

旁注:考虑将 class 设为模板,而不是 typedef int nodeDatatype;

您使用的是什么版本的 c++?尝试在 wandbox 或其他东西中设置。因此,您可以轻松地将确切的消息复制到您的问题中。

一些评论:

错误

  • 使用 std::shared_ptr<> 而不是原始指针。如果您使用原始指针,您 出错。
  • insertHead() 应该是成员函数或友元函数,目前两者都不是。我认为它应该是一个成员函数。
  • 什么是->setData??
  • 什么是->next??
  • insertHead() 编写一些测试以涵盖不同的情况(if 的每一半,等等)
  • 仅使用 int 作为您的数据将在您更改为使用真实数据时掩盖一些错误。使用模板来帮助避免这种情况。

风格

  • 使用 nullptr 而不是 NULL
  • 使用 using nodeDataType = inttemplate<T=int> 而不是 typedef int nodeDataType