似乎无法将我的头文件与链表中的 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
来保存数据,然后可以调用接受 insertHead
的 Node
。例如:
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 = int
或 template<T=int>
而不是 typedef int nodeDataType
假设定义和库正常工作,即。 <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
来保存数据,然后可以调用接受 insertHead
的 Node
。例如:
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 = int
或template<T=int>
而不是typedef int nodeDataType