Как добавить элемент в список c
Перейти к содержимому

Как добавить элемент в список c

  • автор:

Как добавить элемент в список в с++? Как создать список в с++?

Задача такова нужно вывести все числа, до какого-то а. Циклы использовать нельзя. На питоне будет примерно так:

a = int(input("a mt24 mb12">
    c++рекурсия
)" data-controller="se-share-sheet" data-se-share-sheet-title="Поделиться ссылкой на вопрос" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="question" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-location="1" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f4.0%2f" data-se-share-sheet-license-name="CC BY-SA 4.0" data-s-popover-placement="bottom-start">Поделиться
)" title="">Улучшить вопрос
)">изменён 2 фев 2019 в 7:36
Harry
218k15 золотых знаков117 серебряных знаков229 бронзовых знаков
задан 2 фев 2019 в 6:29
1
    Если вы создадите список - то как будете выводить его без цикла? Не то чтобы это было невозможно :), но просто интересен ход ваших мыслей.
    – Harry
    2 фев 2019 в 7:10
Добавить комментарий|

2 ответа 2

Сброс на вариант по умолчанию
2

Именно вывести? тогда зачем вам список?

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); > 

Как добавить элемент в список c

Контейнер 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() можно изменить размер списка. Эта функция имеет две формы:

  • resize(n) : оставляет в списке n первых элементов. Если список содержит больше элементов, то он усекается до первых n элементов. Если размер списка меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
  • resize(n, value) : также оставляет в списке n первых элементов. Если размер списка меньше n, то добавляются недостающие элементы со значением value
std::list numbers< 1, 2, 3, 4, 5, 6 >; numbers.resize(4); // оставляем первые четыре элемента - numbers = numbers.resize(6, 8); // numbers =

Изменение элементов списка

Функция assign() позволяет заменить все элементы списка определенным набором. Она имеет следующие формы:

  • assign(il) : заменяет содержимое контейнера элементами из списка инициализации il
  • assign(n, value) : заменяет содержимое контейнера n элементами, которые имеют значение value
  • assign(begin, end) : заменяет содержимое контейнера элементами из диапазона, на начало и конец которого указывают итераторы begin и end
std::list numbers < 1, 2, 3, 4, 5 >; numbers.assign(< 21, 22, 23, 24, 25 >); // numbers = < 21, 22, 23, 24, 25 >numbers.assign(4, 3); // numbers = std::list values < 6, 7, 8, 9, 10, 11 >; auto start = ++values.begin(); // итератор указывает на второй элемент из values auto end = values.end(); numbers.assign(start, end); // numbers =

Функция 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(val) : добавляет значение val в конец списка
  • push_front(val) : добавляет значение val в начало списка
  • emplace_back(val) : добавляет значение val в конец списка
  • emplace_front(val) : добавляет значение val в начало списка
  • emplace(pos, val) : вставляет элемент val на позицию, на которую указывает итератор pos. Возвращает итератор на добавленный элемент
  • insert(pos, val) : вставляет элемент val на позицию, на которую указывает итератор pos, аналогично функции emplace. Возвращает итератор на добавленный элемент
  • insert(pos, n, val) : вставляет n элементов val начиная с позиции, на которую указывает итератор pos. Возвращает итератор на первый добавленный элемент. Если n = 0, то возвращается итератор pos.
  • insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end. Возвращает итератор на первый добавленный элемент. Если между итераторами begin и end нет элементов, то возвращается итератор pos.
  • insert(pos, values) : вставляет список значений values начиная с позиции, на которую указывает итератор pos. Возвращает итератор на первый добавленный элемент. Если values не содержит элементов, то возвращается итератор pos.

Функции 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 могут применяться следующие функции:

  • clear(p) : удаляет все элементы
  • pop_back() : удаляет последний элемент
  • pop_front() : удаляет первый элемент
  • erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
  • erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

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; // для односвязного списка } }

примерно так. и конечно же ты в этой функции лишь добавляешь элемент но его нужно еще создать и наполнить контентом что делать нужно до этой функции.

Список list в C++: полный материал

обложка статьи

Всем привет! Не давно мы прошли вектор в C++, поэтому сегодня мы решили снова затронуть тему контейнеров и подготовили материал об еще одном контейнере - list.

Что такое список list

Это структура данных, которая построена на двусвязных списках. Это значит, что любой элемент знает только о предыдущем и о следующем элементах.

На картинке ниже показана, как это устроено:

как работает list в C++

У двусвязного списка нет индексов, но вместо их в C++ есть итераторы.

i_am_list[2] = 8; // ошибка!

Программисты используют этот контейнер из-за быстрого добавления и удаление значений. Это происходит так быстро, потому что не приходиться перемещать элементы между собой, нужно лишь правильно манипулировать указателями.

пример добавления элемента в контейнер list лист

пример добавления элемента в контейнер list

На примере выше в начале было два элемента, потом мы решили добавить один элемент между ними.

пример удаление элемента из списка list

пример удаление элемента из списка list

А так совершается удаление.

Как создать список 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 (позиция>, значение>);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *