c++ - 似乎无法将我的头文件与链表中的 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 部分,我可以只插入具有与在头部插入节点相同的功能的数据吗?还是需要分开?
我得到的错误:
未在范围内声明
解决方案
在我看来,这些要求是除了
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;
考虑将类设为模板,而不是 。
推荐阅读
- php - 从数据库中获取特定日期之前的所有记录
- javascript - 在js中对文本文件进行采样
- hibernate - 如何从存储库中查找所有 DTO
- android - 无法通过 viewmodel 向 JOE64 graphview 库显示数据
- sql-server - SSIS DataFlow 文件到表加载非常缓慢
- ios - 离子电容器 - IOS 上的 FCM 推送通知 - 未调用 pushNotificationReceived 侦听器
- powershell - 用于在 DFS 同步后比较两个文件夹数据的 Powershell 脚本
- power-automate - Powerautomate - 同时从多个列中检索数据
- reactjs - React 按钮中字体的颜色选择器
- algorithm - 当我没有在递归方法中设置结束条件时没有抛出错误