Я пытаюсь создать функцию, которая добавляет узел в конец 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;
}
Мой preend (добавить к началу LinkedList) отлично работает, но когда я пытаюсь выполнить этот код, я получаю
main.cpp: 48: 20: error: 'struct Node' не имеет имени с именем 'append' tmp-> next-> append (data);
Поэтому я уверен, что что-то не так, сказав next-> append (data), который из того, что я понял, должен быть рекурсивным вызовом функции добавления, пока не достигнет нулевого указателя. Я думаю, может быть, есть способ написать это, но люди в моем классе говорят мне, что вещь next-> append (data) ДОЛЖНА работать, поэтому, я думаю, я не совсем уверен, почему это не так делать что-либо. Я попытался вместо этого написать функцию append в структуре Node, но затем он говорит, что голова не объявлена в области, и я действительно просто не знаю, как с этим работать. Я также новичок в классах/структурах в C++, поэтому я предполагаю что-то об этом, что я не понимаю.
У класса 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;
}
}
Структура узла не содержит никакого метода добавления. Более того, вы раскалываете работу, которая может быть выполнена в одном методе двумя способами, написав больше кода.
См. Мой ответ на другой вопрос здесь с рабочим кодом, который я написал
qaru.site/questions/7449791/...
Как вы можете видеть, я решаю все в методе
AddItem(int i)
Я начинаю видеть, что создание связанного списка я kindof har для многих здесь, поэтому я буду дополнительно редактировать свой ответ там, чтобы предоставить дополнительную информацию.
Удачи!
Как это
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);
этот append должен быть членом 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);
}
}
}
tmp-> next - это узел, поэтому для вызова функции append необходимо объявить его в структуре узла
Метод append не определен в узле Struct. Вместо этого он определен в классе LinkedList, поэтому вам нужно вызвать его соответствующим образом. Вы можете переопределить метод append, чтобы взять узел в качестве параметра или добавить метод добавления к самому узлу Struct. Также нет необходимости назначать результат добавления к tmp =
Ваш метод append недействителен.