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

时间:2019-06-28 20:33:16

标签: c++ data-structures linked-list header-files

假设定义和库正在工作,即。 <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);

我的实现文件功能(第1部分):

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部分,是否可以仅使用与在头插入节点相同的功能插入数据?还是需要分开?

我得到的错误:

  

未在范围中声明

2 个答案:

答案 0 :(得分:1)

在我看来,要求是

的补充
void insertHead(Node*& head, Node*& entry);

您将需要

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

避免复制data(带有int毫无意义,但可以将typedef更改为更强大的名称)和const的引用,因为{{ 1}}无需修改数据。 const还允许函数接受更多种类的变量类型。

insertHead重载必须构造一个insertHead来保存数据,然后才能调用接受Node的{​​{1}}。例如:

Node

这全部基于

insertHead

已正确实施,目前尚未正确实施。让我们修复一下,因为修复非常简单。

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

与声明不匹配。使用

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

相反。该功能的其余部分主要执行您想要的操作,但以一种非常round回的方式进行。

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

不是必需的。它没有任何危害,但是无论如何我们还是将其保留下来,并一直使用条目。

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

Node* newNode = entry; 是什么?节点中已有的数据有什么问题?

     newNode->setData = setData;

不需要以上大部分内容。新节点位于setData之前,因此无需测试 newNode-> next = NULL; if(head == NULL){ head = entry; } else{ newNode->next = head; head = newNode; } 是否为空,只需将新节点的head指向与{{1} }。换句话说,请始终执行else情况。

head

这曾经很有意义,但现在在定义和声明匹配之后。不要从next函数返回值。

head

我们结束了

     return head;

将所有这些捆绑在一起,

void

然后是实现

}

旁注:考虑将类作为模板,而不是void insertHead(Node*& head, Node*& entry){ entry->next = head; head = entry; }

答案 1 :(得分:0)

您正在使用哪个版本的c ++?尝试在魔盒中进行设置。因此,您可以轻松地将确切的消息复制到您的问题中。

一些评论:

错误

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

样式

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