首页 > 解决方案 > 似乎无法将我的头文件与链表中的 cpp 文件连接起来

问题描述

假设定义和库正在工作,即。<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 部分,我可以只插入具有与在头部插入节点相同的功能的数据吗?还是需要分开?

我得到的错误:

未在范围内声明

标签: c++data-structureslinked-listheader-files

解决方案


在我看来,这些要求是除了

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

你需要一个

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

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

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

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空,只需将新节点指向next与 相同的东西即可head。换句话说,总是做其他情况。

     return head;

这曾经是有道理的,但现在在匹配定义和声明之后。不要从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);
} 

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


推荐阅读