Присоединение узла к LinkedList

0

Я пытаюсь создать функцию, которая добавляет узел в конец 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++, поэтому я предполагаю что-то об этом, что я не понимаю.

Теги:

5 ответов

1
Лучший ответ

У класса 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;
  }
}
  • 0
    Я подумал, что это что-то связано, но я не знал, как это исправить. Я просто поместил void append (int) внутри структуры Node, но это ничего не сделало, поэтому я предполагаю, что теперь вы так и делаете.
  • 0
    @FrostyStraw: я обновил ответ и добавил путь. Проверь это.
Показать ещё 3 комментария
0

Структура узла не содержит никакого метода добавления. Более того, вы раскалываете работу, которая может быть выполнена в одном методе двумя способами, написав больше кода.

См. Мой ответ на другой вопрос здесь с рабочим кодом, который я написал

qaru.site/questions/7449791/...

Как вы можете видеть, я решаю все в методе

AddItem(int i)

Я начинаю видеть, что создание связанного списка я kindof har для многих здесь, поэтому я буду дополнительно редактировать свой ответ там, чтобы предоставить дополнительную информацию.

Удачи!

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); этот 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);
        }
    }
}
  • 0
    Если я сделаю это, я почти уверен, что это скажет мне, что голова не была объявлена в этом объеме. Но я постараюсь
  • 0
    @FrostyStraw Но вам не нужна голова в Node :: append, равно как и голова в псевдокоде, который вам дали. Может быть, проблема в том, что вы не понимаете псевдокод?
Показать ещё 17 комментариев
0

tmp-> next - это узел, поэтому для вызова функции append необходимо объявить его в структуре узла

0

Метод append не определен в узле Struct. Вместо этого он определен в классе LinkedList, поэтому вам нужно вызвать его соответствующим образом. Вы можете переопределить метод append, чтобы взять узел в качестве параметра или добавить метод добавления к самому узлу Struct. Также нет необходимости назначать результат добавления к tmp =

Ваш метод append недействителен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню