Как добавить элемент в список в с++? Как создать список в с++?
Задача такова нужно вывести все числа, до какого-то а. Циклы использовать нельзя. На питоне будет примерно так:
a = int(input("a mt24 mb12">c++рекурсия
Задача такова нужно вывести все числа, до какого-то а. Циклы использовать нельзя. На питоне будет примерно так:
a = int(input("a mt24 mb12">c++рекурсия
Именно вывести? тогда зачем вам список?
void out(int n, int curr = 0)
На всякий случай - а то вы стали создавать вложенные функции 🙁 - вот весь код:
#include using namespace std; void out(int n, int curr = 0) < if (n < curr) return; cout int main(int argc, const char * argv[]) < int m, M; cout > m; cout > M; out(M,m); >
Контейнер list представляет двухсвязный список, то есть такой список, где каждый элемент имеет указатели на предыдущий и последовательный элемент. Благодаря чему мы можем перемещаться по списку как вперед, так и назад. Для использования списка необходимо подключить заголовочный файл list .
std::list list1; // пустой список std::list list2(5); // список list2 состоит из 5 чисел, каждый элемент имеет значение по умолчанию std::list list3(5, 2); // список list3 состоит из 5 чисел, каждое число равно 2 std::list list4< 1, 2, 4, 5 >; // список list4 состоит из чисел 1, 2, 4, 5 std::list list5 = < 1, 2, 3, 5 >; // список list5 состоит из чисел 1, 2, 4, 5 std::list list6(list4); // список list6 - копия списка list4 std::list list7 = list4; // список list7 - копия списка list4
В отличие от других контейнеров для типа list не определена операция обращения по индексу или функция at(), которая выполняет похожую задачу.
Тем не менее для контейнера list можно использовать функции front() и back() , которые возвращают соответственно первый и последний элементы.
Чтобы обратиться к элементам, которые находятся в середине (после первого и до последнего элементов), придется выполнять перебор элементов с помощью циклов или итераторов:
#include #include int main() < std::listnumbers< 1, 2, 3, 4, 5 >; int first ; // 1 int last < numbers.back() >; // 5 std::cout std::cout
Для получения размера списка можно использовать функцию size() :
std::list numbers< 1, 2, 3, 4, 5 >; int size = numbers.size(); // 5
Функция empty() позволяет узнать, пуст ли список. Если он пуст, то функция возвращает значение true, иначе возвращается значение false:
std::list numbers< 1, 2, 3, 4, 5 >; if (numbers.empty()) std::coutС помощью функции resize() можно изменить размер списка. Эта функция имеет две формы:
Функция assign() позволяет заменить все элементы списка определенным набором. Она имеет следующие формы:
Функция swap() обменивает значениями два списка:
std::list list1< 1, 2, 3, 4, 5 >; std::list list2< 6, 7, 8, 9>; list1.swap(list2); // list1 = < 6, 7, 8, 9>; // list2 = < 1, 2, 3, 4, 5 >;
Для добавления элементов в контейнер list применяется ряд функций.
Функции push_back() , push_front() , emplace_back() и emplace_front() :
std::list numbers< 1, 2, 3, 4, 5 >; numbers.push_back(23); // < 1, 2, 3, 4, 5, 23 >numbers.push_front(15); // < 15, 1, 2, 3, 4, 5, 23 >numbers.emplace_back(24); // < 15, 1, 2, 3, 4, 5, 23, 24 >numbers.emplace_front(14); //
Добавление в середину списка с помощью функции emplace() :
std::list numbers< 1, 2, 3, 4, 5 >; auto iter = ++numbers.cbegin(); // итератор указывает на второй элемент numbers.emplace(iter, 8); // добавляем после первого элемента numbers = < 1, 8, 2, 3, 4, 5>;
Добавление в середину списка с помощью функции insert() :
std::list numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // итератор указывает на первый элемент numbers1.insert(iter1, 0); // добавляем начало списка //numbers1 = < 0, 1, 2, 3, 4, 5>; std::list numbers2< 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // итератор указывает на первый элемент numbers2.insert(++iter2, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::list values < 10, 20, 30, 40, 50 >; std::list numbers3< 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // итератор указывает на первый элемент // добавляем в начало все элементы из values numbers3.insert(iter3, values.begin(), values.end()); //numbers3 = < 10, 20, 30, 40, 50, 1, 2, 3, 4, 5>; std::list numbers4< 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // итератор указывает на позицию за последним элементом // добавляем в конец список из трех элементов numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;
Для удаления элементов из контейнера list могут применяться следующие функции:
std::list numbers < 1, 2, 3, 4, 5 >; numbers.pop_front(); // numbers = < 2, 3, 4, 5 >numbers.pop_back(); // numbers = < 2, 3, 4 >numbers.clear(); // numbers =<> numbers = < 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // указатель на первый элемент numbers.erase(iter); // удаляем первый элемент // numbers = < 2, 3, 4, 5 >numbers = < 1, 2, 3, 4, 5 >; auto begin = numbers.begin(); // указатель на первый элемент auto end = numbers.end(); // указатель на последний элемент numbers.erase(++begin, --end); // удаляем со второго элемента до последнего //numbers =
Совершенно не понимаю списки. Теория, независимо от количества, в практику ни в какую не переходит. Задача, которую решаю, в интернете вроде бы есть решенная, но тот код я понять толком не могу.
Напишите пожалуйста кто-нибудь максимально примитивную функцию добавления в список вот к этому (надеюсь таким образом разобраться):
1 2 3 4 5 6 7 8
typedef struct { char dest[20]; int number; char name[20]; char date[10]; request *next; } request;
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Добавление элемента в сортированный список
Привет Форумчане! уже день вишу над вопросом к проекту и не могу сдвинуться дальше. в общем вот.
Добавление элемента в однонаправленный список
Итак, задача: написать мини-программку, которая создает однонаправленный список и выводить его на.
Список: Не могу реализовать вывод, а может и правильное добавление в список.
Помогите пожалуйста. Не могу реализовать вывод, а может и правильное добавление в список. Вообщем.
Добавление элемента после элемента с заданным ключом в однонаправленном списке
Здравствуйте! У меня неправильно работает функция insert, которая должна добавлять элемент после.
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
Если я правильно понимаю,функция должна связать две структуры?
1 2 3 4 5 6 7 8 9
request *connect (request *first,request *second) return first->next = second; }
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
void *Add(request **ppHead, char *dest, int n, char *name, char *date) { /* приняли адрес адреса головы (чтобы внутри функции сделать новую голову и её адрес сохранить вместо старого адреса) */ request *pOldHead = *ppHead; /* сохранили адрес старой головы, взяв его по адресу */ request *pNewHead; /* узел, который будет заполнен и станет новой головой */ pNewHead = new request; /* выделяем для него независимую от функций память после работы функции эта память останется выделенной */ strcpy(pNewHead->dest, dest); /* в узел копируем из строки dest содержимое */ pNewHead->n = n; /* в узел копируем n */ strcpy(pNewHead->name, name); /* в узел копируем из строки name содержимое */ strcpy(pNewHead->date, date); /* в узел копируем из строки date содержимое */ pNewHead->next = pOldHead; /* в новый узел записываем, что следующий узел после него - это старая голова */ *ppHead = pNewHead; /* переходим к адресу старой головы и записываем на его место адрес новой головы, в которой уже всё есть */ return (void *) pNewHead; /* приводим указатель на новую голову к общему виду и возвращаем его из функции, что говорит об успешном добавлении */ /* дальше по всей функции можно добавлять проверки на ошибки (при вызове или в процессе создания, заполнения узла) и добавлять return NULL; в случае каждой ошибки */ }
Регистрация: 23.11.2009
Сообщений: 40
а в C точно можно использовать new?
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
например, вот так в C не получится сделать, в C++ тоже
1 2 3 4 5 6 7 8
typedef struct { char dest[20]; int number; char name[20]; char date[10]; request *next; } request;
1 2 3 4 5 6 7 8
struct request { char dest[20]; int number; char name[20]; char date[10]; request *next; };
а так можно, но только в C++
1 2 3 4 5 6 7 8
typedef struct request { char dest[20]; int number; char name[20]; char date[10]; struct request *next; } Request;
вместо new можно использовать malloc, чтобы перейти на C и, точно также, вместо strcpy можно использовать что-нибудь вроде string, stringstream, чтобы перейти на C++
Регистрация: 01.10.2017
Сообщений: 4
списки куда проще тема чем указатели хотя и последняя не сложна к пониманию.
Список это набор элементов с разным количеством полей. как например список учеников у которых разные имена возраст оценки и т д
так же как ученики списки могут иметь "руки" с помощью которых они показывают на следующего и предыдущего. так как список это не массив то мы не можем перейти из первого элемента сразу на третий или последний (если их не 2). каждый элемент размещен в разных не упорядоченных участках памяти и единственной связью есть "руки". И чтоб перейти из первого на четвертый элемент тебе сначала нужно узнать на что показывает первый потом второй дальше третий и наконец получишь адрес четвертого. считай что "рука"- это я чека в которой имеется адрес на следующий или предыдущий елемнт. списки бывают двусвязные и односвязные и циклические. вот пример односвязной структуры а потом двусвязной
1 2 3 4 5 6 7 8 9 10 11 12 13
typedef struct s_list { char *content; struct s_list *prev; } list; //============================================ typedef struct s_list { char *content; struct s_list *prev; struct s_list *next; } list;
в коде выше можно найти одно различие
именно оно делает списки различными. то, цикличный он или нет можно понять только тем, что в цикличном списке последний ученик указывает на первого ну и первый указывает на последнего если это двусвязный список. В односвязном они не указываюn ни на что и обычно равны NULL.
при добавлении элемента очень важно чтоб не было утечки памяти. например если есть ученики 2 4 5 и мы хотим поставить 3 межу 2 и 4 то если ми в ячейку с указателем next запишем адрес третьего то потеряем навсегда 4 и 5.
таким образом чтоб этого не произошло нужно сначала третьему записать в next адрес 4ого а уже после этого второму записать в next адесс третьего. дублирование указателей на некоторый период это нормальная практика. все тоже относится и к двусвязным спискам. сначала третий должен указывать в next на 4 и в prev на 2 и только после этого ты можешь обрывать связь между 2 и 4 и следовательно в 2 next и 4 prev записать адрес 3го. вот и все танцы с бубном. если будет интересно в двусвязном списке то напишу отдельно. а вообще есть очень большое количество не плохих учебных материалов доступных широкому кругу.
вот часть кода для добавления элементов в односвязный и двусвязный списки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void ft_lstadd(list **alst, list *new_lst) { if (!*alst) *alst = new_lst; //если список пуст то просто указываем его на первый элемент else { new_lst->next = (*alst)->next; (*alst)->next = new_lst; // этого достаточно для односвязного списка //========================= или ======================= new_lst->next = (*alst)->next; new_lst->prev = *alst; (*alst)->next->prev = new_lst (*alst)->next = new_lst; // для односвязного списка } }
примерно так. и конечно же ты в этой функции лишь добавляешь элемент но его нужно еще создать и наполнить контентом что делать нужно до этой функции.
Всем привет! Не давно мы прошли вектор в C++, поэтому сегодня мы решили снова затронуть тему контейнеров и подготовили материал об еще одном контейнере - list.
Что такое список list
Это структура данных, которая построена на двусвязных списках. Это значит, что любой элемент знает только о предыдущем и о следующем элементах.
На картинке ниже показана, как это устроено:
У двусвязного списка нет индексов, но вместо их в C++ есть итераторы.
i_am_list[2] = 8; // ошибка!
Программисты используют этот контейнер из-за быстрого добавления и удаление значений. Это происходит так быстро, потому что не приходиться перемещать элементы между собой, нужно лишь правильно манипулировать указателями.
На примере выше в начале было два элемента, потом мы решили добавить один элемент между ними.
А так совершается удаление.
Как создать список list
Сначала подключаем библиотеку - .
#include
Далее используем конструкцию ниже:
list тип данных > имя контейнера>;
Вот пример создания списка с типом string :
list string> listok;
Как добавить элементы при создании списка
Чтобы сразу после создания списка присвоить ему значения нужно сделать так:
list int> this_list = 4, 6, 3, 2>;
Такой способ можно использовать только в C++ 11 и выше.
Методы списка list
Вот функции которые можно применять в своей программе вместе со списком (нажмите на их имена чтобы перейти на страницу с полным руководством):
pop_front: удалить элемент в начале pop_back: удалить элемент в конце push_front: добавить элемент в начала push_back: добавить элемент в конец front: обратится к первому элементу back: обратиться к последнему элементу insert: добавить элемент в какое-то место copy: вывести все элементы списка (и не только): unique: удалить все дубликаты merge: добавление другого списка
Давайте с несколькими методами познакомимся подробнее.
С помощью его можно добавить новый элемент в любую часть контейнера (в нашем случае для списка). Вот как он работает:
insert (позиция>, значение>);