Автор Андрей Кольцов задал вопрос в разделе Другие языки и технологии
C++. Указатели. Связный список. Как добавить элемент в конец списка? Вопрос для разбирающихся и получил лучший ответ
Ответ от Николай Веселуха[гуру]
Ваш next, последнего элемента в списке указывает на NULL, а новый элемент списка вы создаёте по какому-то указателю, например still, у которого есть свой next, и который также указывает на NULL. Чтобы добавить элемент в конец списка нужно в цикле while дойти до его конца по условию (ptr != NULL), где ptr - это вспомогательный указатель для перемещения по списку, а его первоначальный адрес указывает туда же, куда и указатель по которому был открыт, либо создан список, и затем указателю next последнего элемента списка следует присвоить адрес указателя still
Пример кода, где создаётся структурная переменная к ней добавляется ещё один элемент
#include <iostream>
using namespace std;
struct test
{
int data;
test * next;
//test * tail; // указатель на последний элемент списка, полезная вещь!
// о чём говорил господин Jurijus Zaksas
};
int main()
{
// создали первый элемент списка
test * head = NULL;
head = new test;
head->data = 25;
head->next = NULL;
// создали второй элемент списка
test * still = NULL;
still = new test;
still->data = 50;
still->next = NULL;
// добавляем элемент в конец списка
test * ptr = head;
while (ptr->next != NULL) { ptr = ptr->next; }
ptr->next = still;
still->next = NULL;
// обнуляем ненужный указатель
still = NULL;
// выводим список на экран
ptr = head;
while (ptr != NULL) {
cout << ptr->data << endl;
ptr = ptr->next;
}
// обнуляем ненужный указатель
ptr = NULL;
// освобождаем память по указателю на саписок
delete head;
/* примечание. если поля элеметов списка создавались по указателю
то и память для них выделялась динамически, в этом случае освобождение
памяти следует выполнять также в цикле, для каждого такого поля
*/
cin.get(); cin.get();
return 0;
}
Тут есть 2 путя.
Тупой - каждый раз проходить весь список и искать хвост.
Умный - хранить указатель на хвост отдельно. На голову хранишь - храни и на хвост.
да, двусвязный список юзать лучше. Ну как вариант просто вывести в обратном порядке, если только вывод