void additem(int d)
{
link* newlink=new link;
newlink->data=d;
newlink->next=first;
first=newlink;
}
Это описание одного из методов класса (класс связный список, одно поле- указатель на голову списка) .
link - структура, содержит поле типа int (сам элемент) , и поле next типа link (указатель на следующий элемент) .
Этот метод добавляет элемент в начало списка. Например добавляю 1 2 3. А извлекается соответственно 3 2 1.
Подскажите как изменить метод так, чтобы он добавлял элемент в конец списка? т. е чтобы извлекалось 1 2 3.
Другие языки программирования и технологии
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;
}
Пример кода, где создаётся структурная переменная к ней добавляется ещё один элемент
#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 путя.
Тупой - каждый раз проходить весь список и искать хвост.
Умный - хранить указатель на хвост отдельно. На голову хранишь - храни и на хвост.
Тупой - каждый раз проходить весь список и искать хвост.
Умный - хранить указатель на хвост отдельно. На голову хранишь - храни и на хвост.
да, двусвязный список юзать лучше. Ну как вариант просто вывести в обратном порядке, если только вывод
Михаил Климов
Я бы тоже рад схитрить и просто поменять вывод метода, но тогда вся изюминка дела пропадает =)
Похожие вопросы
- Пожалуйста помогите разобраться с даним кодом C++. Тема : Односвязание списки
- Программирование, C++, курсовая работа по C++ на тему список студентов
- C++ Указатели и функции.
- C++ указатель на ссылку, ссылка на указатель что можно создать и пример кода если нетрудно.
- Вопрос от начинающего ))) Список вопросов (питон, Си и в принципе работа ПК) (Мало что понимаю)
- C++. Вопрос для разбирающихся.
- Помогите пожалуйста написать программу на c++. Циклически сдвинуть массив на k элементов влево.
- даны три массива A[6,6], B[6,6],C[6,6]. найти сумму максимальных элементов, расположенных на главной диагонали
- C++ Как найти сумму и произведение элементов K - го столбца данной матрицы?
- хочу создать свой сайт на бесплатном хостинге с перечнем реализуемого товара, в этих вопросах не разбираюсь совсем