假设定义和库正在工作,即。 <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部分,是否可以仅使用与在头插入节点相同的功能插入数据?还是需要分开?
我得到的错误:
未在范围中声明
答案 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 = int
或template<T=int>
而不是typedef int nodeDataType