C : добавить узел в связанный список

#c #linked-list

#c #связанный список

Вопрос:

Это то, что мне нужно сделать: append_data добавляет узел в конец списка, на который указывает top. результирующий список на один элемент длиннее, а вновь добавленный узел имеет заданное значение данных. рассмотрите возможность использования функции ‘append’, чтобы помочь. аннулировать AppendData (данные int);

append — это то же самое, что и append_data , за исключением того, что мы добавляем узел, а не значение. недействительное добавление (shared_ptr new_node); Я смог добавить данные, используя этот код, но в идеальном мире я мог бы передать Append через AppendData и получить тот же результат. Я борюсь с Append прямо сейчас, хотя ответ находится в коде AppendData

»’

 void LinkedList::AppendData(int data){

    shared_ptr<node> temp(new node);
    temp->data = data;
    temp->next = shared_ptr<node>(NULL);
    
    shared_ptr<node> end_node(top_ptr_);
    
    if(end_node == NULL) {
      end_node=temp;
    } else {
      while(end_node->next!=NULL) {
        end_node=end_node->next;
      }
      end_node->next=temp;
    }
    }
    
void LinkedList::Append(shared_ptr<node> new_node){}
  

»’

Комментарии:

1. Вы уверены, что ваш AppendData() код работает? end_node = temp; в частности, выглядит подозрительно.

2. Если Append можно было бы использовать, просто сохраните первые 3 строки и напишите: Append(temp) . Если не удалось, вам лучше опубликовать содержимое Append .

Ответ №1:

в идеальном мире я мог бы передать Append через AppendData и получить тот же результат.

На самом деле, Append содержит меньше информации, чем AppendData , в частности, сами данные. Было бы разумнее реорганизовать его таким образом, чтобы AppendData создать узел, а затем вызвать Append добавление этого узла в список:

 void LinkedList::AppendData(int data){

    // construct node
    shared_ptr<node> temp(new node);
    temp->data = data;
    temp->next = shared_ptr<node>(NULL);

    // append it
    Append(temp);   
}
    
void LinkedList::Append(shared_ptr<node> new_node){

    shared_ptr<node> end_node(top_ptr_);
    
    if(end_node == NULL) {
      end_node = new_node;  // new_node instead of temp
    } else {
      while(end_node->next!=NULL) {
        end_node=end_node->next;
      }
      end_node->next = new_node;  // ditto
    }
}
  

Кроме того, эта строка end_node = new_node; неверна. Если список пуст, вам нужно обновить top_ptr_ следующим образом:

 top_ptr_ = new_node;