我正在尝试创建一个将节点添加到LinkedList末尾的函数。我知道如何使用循环来做,但我的教授希望它以某种方式完成,我不明白为什么它不起作用。他几乎给了我们所有的代码..
这是他给我们的伪代码:
process append(data)
if (not the end)
next->append(data);
else
next=new Node();
next->data=data;
next->data = nullptr;
这就是我想出来的:
struct Node {
int data;
Node* next;
};
struct LinkedList {
Node* head;
LinkedList() {head = nullptr;}
void prepend(int data) {
if (head == nullptr) {
Node* tmp = new Node();
tmp->data=data;
tmp->next=nullptr;
}
else {
Node* tmp = new Node();
tmp->data=data;
tmp->next=head;
head=tmp;
}
}
void append(int data) {
Node* tmp = head;
if (tmp->next != nullptr) {
tmp=tmp->next->append(data);
}
else {
tmp->next = new Node();
tmp->next->data = data;
tmp->next->next = nullptr;
}
}
};
int main()
{
LinkedList LL = LinkedList();
LL.prepend(7);
LL.append(6);
std::cout << LL.head->data << std::endl;
}
我的前置(添加到LinkedList的开头)工作正常,但是当我尝试这段代码时,我得到了
main.cpp:48:20:错误:'struct Node'没有名为'append'的成员 TMP-&GT;下一步 - &GT;附加(数据);
所以我很确定说next-&gt; append(data)有什么问题,根据我的理解,这应该是递归回调append函数直到它到达nullpointer。我想也许有某种方式可以写它,但我班上的人告诉我下一个&gt;追加(数据)的东西应该工作,所以我想我不确定为什么这不是做任何事情。我尝试在Node结构中编写append函数,但之后它表示head未在范围中声明,我真的只是不知道如何使用它。我对C ++中的类/结构也有点新意,所以我假设它是我不理解的东西。
答案 0 :(得分:2)
类Node
没有任何名为append
的方法,因此您收到错误消息:
tmp->next->append(data);
^^^^^^^^^^^^^
struct Node {
int data;
Node* next;
};
要将节点附加到链接列表,您在append
中不需要Node
方法。删除它。更正LinkedList::append
中的追加流程:
void append(int data) {
Node* tmp = head;
while (tmp->next)
tmp = tmp->next;
tmp->next = new Node();
tmp->next->data = data;
tmp->next->next = nullptr;
}
我没有测试,但你需要像上面的代码一样。首先,它尝试访问列表的末尾。然后它附加一个节点。
递归实施:
void append(int data) {
append(data, head);
}
void append(int data, Node *node) {
if (node->next)
append(data, node->next);
else {
tmp->next = new Node();
tmp->next->data = data;
tmp->next->next = nullptr;
}
}
答案 1 :(得分:0)
您的追加方法未在结构节点上定义。相反,它在LinkedList类上定义,因此您需要相应地调用它。您可以重新定义append方法以将节点作为参数或向Struct节点本身添加append方法。此外,无需将附加结果分配给tmp =
您的追加方法无效。
答案 2 :(得分:0)
喜欢这个
struct Node
{
void append(int data)
{
if (next)
next->append(data);
else
{
next = new Node();
next->data = data;
next->next= nullptr;
}
}
int data;
Node* next;
};
从伪代码next->append(data);
可以清楚地看出,追加是Node
的成员。
以下是您使用Node::append
LinkedList::append
的方式
class LinkedList {
void append(int data) {
if (head == nullptr) {
head = new Node();
head->data=data;
head->next=nullptr;
}
else {
head->append(data);
}
}
}
答案 3 :(得分:0)
tmp-&gt; next是一个Node,所以要调用append函数,你必须在Node struct中声明它
答案 4 :(得分:0)
节点结构不包含任何追加方法。 此外,您正在分割可以在一种方法中完成两种方法的工作,编写更多代码。
使用我写的工作代码
,在这里查看我对另一个问题的回答https://stackoverflow.com/a/37358192/6341507
如您所见,我在方法中解决所有问题
AddItem(int i)
我开始看到创建链表我对很多人来说很有用,所以我会在那里进一步编辑我的答案以提供更多信息。
祝你好运!