Тёмный

Реализация односвязного списка c++ Часть 1 | Урок  

#SimpleCode
Подписаться 371 тыс.
Просмотров 359 тыс.
50% 1

В этом уроке мы начнём писать собственный односвязный список на языке программирования C++ с подробными пояснениями.
Односвязный список | Динамические структуры данных #1
Теория goo.gl/E5KrVi
Определение методов вне класса. Вынести функцию в из класса. Вынести описание метода вне класса. #89
goo.gl/gqh536
Шаблоны классов с++ примеры. Обобщенные классы. Изучение С++ для начинающих. Урок #126
goo.gl/U99h9t
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
🔴🔴🔴 www.donationale...
или тут
🔴🔴🔴 / simplecode
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit

Опубликовано:

 

2 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 351   
@akkh6971
@akkh6971 2 года назад
Не описать словами чувство удовлетворения от понимания устройства односвязного списка после ваших разъяснений! Спасибо большое!
@neverhoodJK
@neverhoodJK 6 лет назад
ну ты дал, Сергей!:)) загрузил так загрузил:) самое удивительное, что я все понял, а я новичок в этом) Спасибо! и присоединяюсь про бабосы с первой зп. Это заслуженно 100%.
@viktoriiavolkova756
@viktoriiavolkova756 6 лет назад
Спасибо вам большое. Я сама студентка и нам сказали лабы писать на С++, теперь вся група смотрит вас и учиться. Вы хорошо рассказываете, понятно. Спасибо.
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
Пожалуйста!
@МаксимПритолюк
@МаксимПритолюк 4 года назад
@@SimpleCodeIT Сергей, подскажите, пожалуйста, в каком уроке появился синтаксис типа "current->pnext" или "current-> data" 20:34
@shoorikefimov6759
@shoorikefimov6759 4 года назад
@@МаксимПритолюк Урок про указатель this №94. Коротко: с прототипа класса к полям обращаемся через точку, с указателя через -> Node current; current.pNext; Node *current; current->pNext;
@mykhailomorhal2181
@mykhailomorhal2181 6 лет назад
Обещаю часть своей первой зарплаты (от работы програмиста) отправить вам на поддержку канала!
@АркадийЖ-ж3ъ
@АркадийЖ-ж3ъ 6 лет назад
Присоединяюсь, отличная идея!
@llllNEOllllchannel
@llllNEOllllchannel 6 лет назад
peace да ball
@iii-mk7no
@iii-mk7no 4 года назад
@Artur Golovenko Тебе так хочется верить. Я отучился на программиста, за 5 лет обучения я знаю меньше чем с уроков ютуба(т.к там преподу пофигу знаешь ты или нет. Он приходит сидит там мямлет что то себе под нос, читая слайд шоу. На ютубе ты можешь выбрать канал, а препода в универе нет.При обучении я просто ненавидил с++.) Конечно нужно еще почитать кое какой инфы и книг, много гуглить, много проб и ошибок. Этот диплом, что я получил мне абсолютно никакой пользы не принес. Работаю не по специальности. Данная работа мне приносит, для моего опыта и возраста колоссальный доход ,какие то цифры я приводить не буду, дабы тут не хвастаться не перед кем. Но у данной моей работы есть огромные минусы. Она очень тяжелая, много грязи, и еще связана с командировками(причем бывают и по пол года). Поэтому я решил вернуться к истокам с чего и начинал, к программированию. Смотря курс Сергея(ему огромное отдельное спасибо!!!!). Я постиг много во, теперь действительно могу что то написать. Читаю книги Бьерна Страуструппа, все свое свободное время просто вкладываю в обучение. Учу параллельно английский. Главное вера в себя, хорошая усидчивость, голова на плечах и руки не из одного места:) Сергею еще раз большое спасибо, из всех просмотренных мной каналов это самый лучший. Он действительно хорошо все объясняет, как говорят, нам все разжевал - осталось только в рот положить. По сравнению с тем же Дударем(давайте создадим переменную, а хотя можно и не создавать) - его смотреть это когда все знаешь.
@avocadoman6038
@avocadoman6038 4 года назад
@@iii-mk7no Ну, как бы суть современного высшего образования в том, что тебе указывают нужное направление, а дальше ты сам в интернете и библиотеках учишься.
@mykhailomorhal2181
@mykhailomorhal2181 4 года назад
@@jojomajo 1) Російська мова не є моя рідна 2) Гроші я переказав, можеш спитати у автора 3) Зараз працюю в Європі айтішніком :) За допомогою цього вже всю Європу об'їздив, фотки вислати?)
@SeshAlex
@SeshAlex 6 лет назад
Спасибо за урок! Для учащихся - в процессе урока пишите код, на не понятных моментах делайте паузы и перебирайте код отладчиком или глазами, так легче мозг принимает информацию.
@ГусейнСалахов
@ГусейнСалахов 4 года назад
Очень полезный урок. Ребят, если вы переписывайте код, то не забывайте его комментировать во-первых для того, чтобы самому лучше понять как и что работает, а во-вторых, чтобы при просмотре вашего кода, например через месяц, вы не путались в огромном количестве строк кода. А также не забывайте комментировать и ставить лайки под такими видео, чтобы увеличить их популярность.
@observer7742
@observer7742 Год назад
Огромное спасибо! Отличные, понятные, содержательные уроки. Очень полезно!
@andrewbistroff1199
@andrewbistroff1199 6 лет назад
Спасибо за урок!
@sergeysitenko
@sergeysitenko 4 года назад
У вас в плейлисте "Основы C++. Программирование для начинающих" не хватает теории про односвязный список. (то что ссылка в описании видел)
@ИринаИрина-ш5ы7р
Спасибо за разъяснение.Всё толково и понятно!❤
@Hikikomori123
@Hikikomori123 10 месяцев назад
чего добился за эти 5 мес?
@ИринаИрина-ш5ы7р
@ИринаИрина-ш5ы7р 10 месяцев назад
​@@Hikikomori123всё работает хорошо.Список у меня из структур.Хотел что бы происходила сортировка по какой либо записи структуры,но пока не знаю как используя стандартные средства среды это сделать?
@романМельситов
@романМельситов 6 лет назад
классный урок, спасибо Сергей!
@rudthakyred_alert6359
@rudthakyred_alert6359 3 года назад
Не знаю как в VS17 а в VSCode и компиляторе g++, чтобы исключить ошибку декларирования ("error: declaration of template parameter 'T' shadows template parameter") можно писать так: template class List { private: template //Т - ненадо объявлять, т.к. переменная объявлена ранее class Node { public: Node *pNext; T data; Node(T data = T(), Node *pNext = nullptr) { this->data = data; this->pNext = pNext; } }; Node *head; int Size; public: List(/* args */); ~List(); void push_back(T data); int GetSize() { return Size; } T &operator[](const int index); };
@PixelArtCode
@PixelArtCode 3 месяца назад
Огромное спасибо. Очень выручил!
@ilyat7109
@ilyat7109 4 года назад
Данная программа не компилируется, выдается ошибка (declaration of template parameter 'T'). Проверил в нескольких компиляторах везде одна и та же ошибка. Как её решить? А главная, почему программа в ролике вообще компилируется ???????????????
@hotabmax6431
@hotabmax6431 4 года назад
Мы создаём объект List. Внутри объекта лист счётчик и капсула Node с адресом следующей капсулы и данными. Функция push_back создаёт указатель на первую капсулу. Если адрес следующей капсулы равен нулю, то в переменной pNext мы создаём новую капсулу, если же там есть адрес то мы перебираем все адреса путём присваивания из капсулы head параметра pNext следующего адреса в переменную current. И так пока адрес следующей капсулы не будет равен 0. И опять же дойдя до этого элемента присваиваем в параметр pNext следующую капсулу. 3 дня ушло чтобы это всё понять)
@МирланНурланбекУулу-з9б
Привет а зачем нужно создавать временный указатель(current) ?
@Jeff-cn4sf
@Jeff-cn4sf Год назад
@@МирланНурланбекУулу-з9б она типа временная, я тоже задался этим вопросом. Попробовал сделать без нее используея this->head ну и это даже не компилилось) Это позволяет, я так понял, обращаться по очереди к каждому адресу это в случае перегрузки operator[], а в PushBack() это позволяет последовательно создавать новые элементы списка. Трудно объяснить к сожалению, но отладчиком все хорошо можно проследить)
@nick-ei2og
@nick-ei2og Год назад
По сути в этом нет ничего сложного, просто столько времени уходит на понимание, потому что никто не умеет нормально объяснять, выделяя основную суть что и зачем делается. Что автор, который заваливает кодом, нежели говорит суть, что этот комментарий, под которым я пишу, в котором уровень пунктуации на крайне печальном уровне. Из-за этого вполне простые вещи в голове разбрасываются в хаотичном порядке, и становится сложнее втройне, просто потому что людям не дано нормально объяснять
@Lol-nz7fn
@Lol-nz7fn Год назад
@@nick-ei2og Сказал человек, который растянул мысль на целый параграф)))
@Lol-nz7fn
@Lol-nz7fn Год назад
@@МирланНурланбекУулу-з9б Указатель current мы создаём потому что он перебирает все элементы, тем самым присваивая себе эти элементы по очереди, пока не дойдёт до последнего элемента и дальше не создаст новый(речь идёт о Push_Back), а head нельзя изменять потому что это начальный элемент
@dedreddead
@dedreddead 5 лет назад
По-моему намного выгоднее завести отдельный указатель на конец списка (tail) и без этого цикла сразу полю next этого указателя присваивать новый node. И затем просто переставить указатель на конец списка этому новому node. if (head == nullptr) { head = new node(elem); tail = head; } else { tail->next = new node(elem); tail = tail->next; }
@Непрофессионалымы
безмерная благодарность Тебе
@РоманРоман-з2с
@РоманРоман-з2с 3 года назад
Вообще не знаю, как бы я понимал программирование без Сергея. Спасибо, друг.
@_girnetix_
@_girnetix_ 2 года назад
Было бы неплохо добавить указатель на последний элемент этого списка, т.к. при больших значениях узлов такого списка, его создание займёт огромное количество времени
@НатальяЖильцова-т2ц
выдает ошибку error: declaration of template parameter 'T' shadows template parameter|
@assert_null
@assert_null 4 года назад
Потому что Node не должен быть шаблоном, если List - шаблон. Или, по крайней мере, имя шаблонного параметра у Node не должно совпадать с таковым у List. Но лучше все-таки первый вариант.
@brennydit
@brennydit 6 месяцев назад
храни тебя господь, долгих тебе лет жизни, спасибо за огромнейший труд, на твоем канале довольно давно сижу, всю процедурку вместе с тобой прошел, почти все ООП, понял как работает односвязный список, спасибо тебе огромное, настоящий учитель)))))))))
@prostocrazy1105
@prostocrazy1105 Год назад
я целых часов 5 наверное сидел и перетирал что вообще происходит(в частности с тем откуда 2 поля(pNext) у 1 переменной )
@КінчурВадим
@КінчурВадим 5 лет назад
Урок предельно понятный и информативный, но нужно еще и самому всё это написать и пробежаться отладчиком.
@draconicentity7240
@draconicentity7240 5 лет назад
пиздец сложно
@higiro9333
@higiro9333 3 года назад
Окей, а что там с деструктором?
@thetiphon
@thetiphon Год назад
Я думаю объект типа T в функцию push_back надо передавать по ссылке, а не по значению. А то получается ты копируешь объект 3 раза: из main в push_back, из push_back в конструктор Node и из конструктора Node в переменную data класса Node
@СарматПересветов
@СарматПересветов 3 года назад
даужь, начались наконец то уроки по сложнее
@ДмитрийБузницкий-б3н
Спасибо за столь не простой урок. По уровню сложности я бы его оценил как урок про конструкторор копирования. Однако, пересматривая урок по несколько раз с каждым разом, понимание становится лучше и лучше.
@alexshyshkov3919
@alexshyshkov3919 6 лет назад
видео класс, жду уроков про очередь и бинарное дерево)
@ДмитрийОвчаренко-д5е
Если мы динамически выделяем здесь память, почему нет ее освобождения?
@MadRedMarx
@MadRedMarx 4 года назад
Главное, что определение методов внутри определения класса делает их встроенными, что не нужно в большинстве случаев. А уже потом это загромождает код.
@anastasiagolomazova4961
@anastasiagolomazova4961 4 года назад
Знаю вопрос глупый, но! Не могли бы вы объяснить почему мы не можем класс Node вписать вне класса List и потом просто к нему обращаться
@overdoses1794
@overdoses1794 6 лет назад
Уважаемый, Сергей! 10к подписчиков, с чем я вас сильно поздравляю=). Надеюсь ролик о том, как вы стали программистом монтируется(просто не терпится послушать).
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
Спасибо! Я всё помню, ролик будет завтра.
@ОлексійВискворкін
мозг кипит)
@ДмитрийКулявец-в5у
head = head->pNext;//head получает адрес следующего элемента списка Но где в коде описано когда этот адрес на следующий элемент получен? Когда head->pNext получило какое-то значение, а не nullptr?
@АлексейП-х1ш
@АлексейП-х1ш 3 года назад
3 часа бился над ошибкой, почему не выводит результат lst[2], при этом забыв завести команду lst.push_back(22). Только отладчиком понял, что условие if не возвращает результат, потому что 3 переменную листа не завёл)) Кстати в кодблокс пришлось у Node делать тип T1, иначе не работает. Спасибо комментариям снизу. Тема обсуждалась, когда число подписчиков было 10 тыс, а я смотрю когда уже 233 тыс. Спасибо, Сергей за отличные уроки. Надеюсь через год переквалифицируюсь из инженера-конструктора в программисты.
@realisttt
@realisttt 3 года назад
Почему-то у меня не компилируется
@kelvin7447
@kelvin7447 Год назад
Попробуйте завтра.
@DmitryDolganov
@DmitryDolganov 5 лет назад
Спасибо!
@pashakkaa
@pashakkaa 6 лет назад
Автору огромное спасибо за урок! Скажите, пожалуйста, обязательно ли внутренний класс Node делать шаблонным? Ведь и класс List, и класс Node всегда будут работать с одинаковыми типами данных.
@stephandolskii7964
@stephandolskii7964 2 года назад
Я не знаю, как бы я изучил ЭТО без таких прекрасных объяснений. Это шедевр
@tonysile2906
@tonysile2906 4 года назад
Всё бы хорошо, но в списке добавление элемента происходит за константное время, в этом весь смысл списка. У вас же добавление за сделано за O(n)
@АндрейМиненко-ц3з
Спасибо за урок
@darth_kenobi4136
@darth_kenobi4136 2 года назад
Для тех кто не понял как работает pNext: while просматривает значение current->pNext, если оно не nullptr то берет значение адреса памяти следущего елемента. а присваиваеться это следущее значение текущему в функции push_back этими строчками: Node* current = this->head;//создаеться указатель на первый указатель класса если у первего указателя переменная pNext = null; то создаеться новый екземпляр класса Node с pNext = null, а pNext у head(если изменить значение у указателя то значение основного обьекта также смениться) становиться равным адрессу памяти нового екземпляра при помощи: current->Nextptr = new Node(data); и так можно добавлять елементы до бесконечности, каждый елемент будет хранить указатель на следущий
@ИванЯценко-ф6ч
@ИванЯценко-ф6ч 3 года назад
Переписал весь код и программа выдает ошибку Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: __thiscall List::List(void)" (??0?$List@H@@QAE@XZ) в функции _main. List C:\Users\Иван\source epos\List\List\Main.obj 1
@alexeyburn857
@alexeyburn857 Год назад
Спасибо за обучающее видео, возник вопрос: для чего сделали отдельную реализацию методов?
@borovanyavanyabor3822
@borovanyavanyabor3822 Год назад
наверное, чтобы не нагружать код и его было легче понимать
@Retyioaqe
@Retyioaqe 5 лет назад
Если выдает ошибку "error: declaration of template parameter 'T' shadows template parameter", то попробуйте назвать параметры по-разному: например T для class List и T1 для class Node.
@TheWladberlin
@TheWladberlin 4 года назад
Что-то все-равно не идет, та же ошибка
@TheWladberlin
@TheWladberlin 4 года назад
бл... я Т по ходу кириллицей писал! Теперь все норм.
@maxamly
@maxamly 5 лет назад
Господи это реально лучший канал по си плюсам, Чувак ты лучший❤️❤️❤️
@ertargn
@ertargn 6 лет назад
спасибо чувак.. сними уроки для c#. буду благодарен
@私を忘れて
@私を忘れて Год назад
пишу идентичный код, выдает ошибку "ссылка на неразрешенный внешний символ"
@mrrodman5265
@mrrodman5265 5 лет назад
Вопрос: как сохраняется указатель *current, который создался в методе push_back? Разве он не должен уничтожится когда мы выходим за область видимости?
@SeshAlex
@SeshAlex 6 лет назад
Кстати. Запустил прогу, вписал 50 тыщь, и консоль затупила)) Теперь я понял в чем разница списка и массива. Массив быстрее работает с большими индексами.
@Куся-ч9я
@Куся-ч9я 3 года назад
Ахахахах, тоже показательный пример
@borisshalabanov4620
@borisshalabanov4620 6 лет назад
спасибо
@pashastatch8313
@pashastatch8313 5 лет назад
Сегодня на собесе загрузили по данной теме, хотя опыт 20 лет на сях. Всегда есть чему учится.
@vavinbogdan9471
@vavinbogdan9471 4 года назад
Все то хорошо, но а если несколько разных типов данных, то как это реализовать вообще не понятно.
@ДимаБерглезов-т7х
@ДимаБерглезов-т7х 3 года назад
А где код?
@АртемЖуков-п7ш
@АртемЖуков-п7ш 2 года назад
8:20 не понял зачем это нужно? если мы передадим класс или любой другой тип данных, то у нас в любом случае переменная data будет инициализирована, так как в конструкторе this->data = data; Но вы сами сказали на 7:59 , что данных нет. в T будет храниться мусор.
@andrytitoruk4205
@andrytitoruk4205 4 года назад
невозможно преобразовать аргумент 1 из "Т" в "List::Node *"
@Andrey-qj9sj
@Andrey-qj9sj 4 года назад
Нашёл решение?
@andrytitoruk4205
@andrytitoruk4205 4 года назад
@@Andrey-qj9sjнет
@oljaolsa7261
@oljaolsa7261 4 года назад
поміняй місцями параметри в класі нут в круглих дужках спочатку напиши T data=T() а потім Node *pNext
@ДенисКвантум
@ДенисКвантум 4 года назад
@@oljaolsa7261 Вы серьезно думаете что все знают укр язык?
@ДенисКвантум
@ДенисКвантум 4 года назад
Код целиком скинь
@alexandrkarpov4544
@alexandrkarpov4544 4 года назад
Спасибо за уроки, Сергей! Надеюсь еще читаете эти комментарии. Такой вопрос: Решил после просмотра серии уроков про список, написать самостоятельно по полученным знаниям свой класс списка. И на моменте описания перегрузки оператора [ ] у меня получились расхождения с вами. В моем случае я эту перегрузку описал так: template T& List::operator[](int index) { int counter = 0; Node* current = head; while (counter != index) { current = current->pNext; counter++; } return current->data; } Подскажите, как мне кажется мой вариант более компактный, однако он допускает значения индекса больше, чем список имеет значений. И в случае превышения индекса программа завершается с ошибкой, как это было бы с обычным массивом, выйдя за его пределы. В вашем же случае, при выходе за границы результат всегда будет 0. Помню вы говорили, что лучше если программа завершится с ошибкой, чем выдаст какое-то значение, из-за которого дальнейшая работа будет некорректна и мы устанем искать причину такого поведения. Собственно вопрос, как лучше описывать эту перегрузку?)
@jangiryanarsen4952
@jangiryanarsen4952 6 лет назад
Не видит шаблон template. Ошибка Declaration of 'T' shadows template parameter. Mac OS X 10.13.4 , cреда разработки XCode 9.3. Почему не видит, пока не пойму. Кто встречался с проблемой подскажите как решить. Cпасибо заранее.
@masasikisimoto26
@masasikisimoto26 5 лет назад
Мне помогло просто удалить строку template над объявлением класса Node. Класс List является шаблонным, так что класс Node не нужно делать шаблонным он и так может работать с типом Т, т. к. является частью класса List. Так как в видео возможно только с visual studio.
@pruss_utb184
@pruss_utb184 5 лет назад
@@masasikisimoto26 У меня в VS 2017 (на 32-разрядной W7) в строчке под название этого шаблона подчеркивалось красным пунктиром слово List перед круглыми скобками - в выражении List::List(). Ничего из прочитанного в этом форуме не помогало. Тогда я просто воспользовался подсказкой с желтой лампочкой, которая возникала при подведении курсора к месту ошибки: там было написано что-то вроде "Создать определение List в файле source.cpp". Я согласился, закрыл открывшуюся после этого форму ввода данных, никаких добавлений к коду не обнаружил, но подчеркивание исчезло. Затем вместе с Сергеем прошел отладку (с 16:57). Вроде, все нормально пока...
@masasikisimoto26
@masasikisimoto26 5 лет назад
@@pruss_utb184 может ты просто забыл объявить конструктор List() внутри самого класса, в public секции. Или возможно просто забыл где ; поставить или скобку пропустил.
@pruss_utb184
@pruss_utb184 5 лет назад
@@masasikisimoto26 Верно: после упомянутой выше отладки, эта проблема все равно давала о себе знать и я в конце концов создал конструктор (а заодно - и деструктор) по умолчанию в public секции класса List. Дальше все работало нормально до самого конца.
@Freedom_Code
@Freedom_Code 5 лет назад
Такая же дичь , как решал ?
@alexandrkryvopust7505
@alexandrkryvopust7505 2 года назад
Может кому-то будет изначально не понятно как и мне. Указатель head содержит адрес по которому одновременно хранятся данные + указатель на следующий элемент. Соответственно когда в функции push_back мы создаем указатель current то в него попадает, то что лежит по первому элементу List (это два поля данные и указатель(который, для случая, что у нас только 1 элемент листа все еще равен nullptr). Затем мы в поле указателя ячейки листа у которой поле указателя на следующий элемент равно nullptr присваиваем адрес данных (новая ячейка) которую мы функцией Push_back добавляем.
@RensetVideos
@RensetVideos 6 лет назад
Спасибо за урок, но было бы лучше, если на простые вещи было бы меньше акцента, а на более сложные - больше.
@artembezruk2789
@artembezruk2789 2 года назад
При компиляции выдается ошибка: Declaration of 'T' shadows template parameter. Похоже шаблон вложенного класса Node конфликтует с шаблоном объемлющего класса List
@mxr1an677
@mxr1an677 2 года назад
just use this - std::string
@mxr1an677
@mxr1an677 2 года назад
u should click on "T" and write std::string
@assert_null
@assert_null Год назад
У автора концептуальная ошибка. У Node вообще не должно быть шаблонного параметра. Он его возьмет у List, т.к. вложен в него. Распространенная ошибка при написании шаблонных структур данных.
@Kalin_cheetah
@Kalin_cheetah Год назад
@@assert_null я из-за этого несколько вечером потратил, чтобы разобраться блин в этом... фаааак)) ну зато детально шаблоны изучил пока разбирался. Пытался конструктор Node вынести наружу (его определние) и никак не мог сделать, а оказалось проблема в том, что у Node не должен дублироваться шаблон, а он его перенимает у объемлющего класса. Как же полегчало. Пойду жену за бока щипать на радостях!
@assert_null
@assert_null Год назад
@@Kalin_cheetah можно оставить параметр у Node, но тогда у него должно быть другое имя. Это будет избыточно и, как я сказал, концептуально ошибочно (отдельный параметр у Node будет означать, что допустима ситуация, когда его параметр отличается от параметра объемлющего класса, но в данном случае такого не может быть), но работать будет.
@DodajonXusnitdinov
@DodajonXusnitdinov Год назад
блин че то у меня выходит ошибка, "error : declaration of template parameter ‘T’ shadows template parameter", не знаю как обойти эту ошибку , пробовал самостоятельно обойти и решить проблему но не получилось
@tyomka4265
@tyomka4265 6 лет назад
очень интересно
@ВиталийПресный
@ВиталийПресный 5 лет назад
А если через оператор индексирования нужно вывести несколько элементов, как это сделать?
@incandesc3nce
@incandesc3nce Год назад
что-то у вас какой-то код с ошибками: No viable overloaded '=' и Invalid operands to binary expression ('Node' and 'nullptr_t'). Как у вас скомпилировалось - вообще не понятно.
@sergeychernov5094
@sergeychernov5094 3 года назад
Ребята, подскажите пожалуйста, каким образом новый экземляр класса Node присваивается укателю header в области видимости метода pushback 16:30 строка 60 (Node* header = new Node(data)). Как это работает? Обычно к указателям можно присвоить ссылки.
@gromitwoll6907
@gromitwoll6907 3 года назад
И как теперь найти исходники в ВК? их там нету
@ИванКозловский-ш9н
привет из 2023, спасибо большое за урокаи!
@Amigo_GO
@Amigo_GO 4 года назад
20:42 Для тех кто решил запустить код на этом этапе и компилятор выдал ошибку: Нужно прописать деструктор класса List, хотя бы пустой.
@ryangosling7954
@ryangosling7954 3 года назад
Господи, чувак, спасибо большое! Деструктор у меня был, но похоже кривой, но заработало!
@shibu5180
@shibu5180 Год назад
спасибо
@nap0le0nb0naparte7
@nap0le0nb0naparte7 6 лет назад
Спасибо большое Сергей за реализацию списка!
@Salavat1k
@Salavat1k 5 лет назад
долго пытался понять почему в функции push_back в условии цикла пишется: Node *current = this->head; while (current->pNext !=nullptr) {...} а в перегрузке оператора условие цикла пишется иначе: Node *current = this->head; while (current! = nullptr){...} не сразу дошло, что в первом случае ищется последний узел и у него в pNext заменяется 0х000000 на адрес нового узла , а во втором случае нам ничего заменять и создавать не нужно, просто происходит переход по всем адресам pNext пока не наткнется в конце на 0х0000000, если условие внутри цикла не будет выполнено. Проблема будет если индексом прописать число, которое больше чем элементов списка. Как понимаю, рассчитано на то, что в рамках урока будут вводится адекватные данные.
@slimbdeful
@slimbdeful 6 лет назад
А как же деструкторы ?? New есть, а delete нет.. и деструктор пустой.. Реализация в следующей части будет ?
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
В следующей части.
@ЧеченскийУголок
@ЧеченскийУголок 4 года назад
вот сейчас я действительно ничего не понял
@КОД-ш8у
@КОД-ш8у 5 лет назад
на 29 строчке, что это? где урок о такой записи?
@ЯрославГоловко-ф6и
спасибо
@KorolElizavetaR
@KorolElizavetaR Год назад
Ловите мой вариант функции push_back void List::push_back(T info) { if (tail == NULL) tail = head = new Node(info, head); else tail = tail->next = new Node(info); size++; } в этом варианте в классе должен быть еще Node*tail, который всегда будет находиться в самом низу списка (он все еще односвязный), tail->next всегда = NULL. Такой вариант кода позволяет не пробегать по всему списку каждый раз, когда элемент надо добавить вниз.
@1mpalo362
@1mpalo362 8 месяцев назад
а почему поле Size не является статическим?
@sleepyNovember_project
@sleepyNovember_project 8 месяцев назад
Тоже думал не сработает, акак оно тут работает не статическим?
@1mpalo362
@1mpalo362 8 месяцев назад
@@sleepyNovember_projectтоже не понимаю, у каждого объекта вроде свой Size
@nicefaill5758
@nicefaill5758 7 месяцев назад
​​​​@@1mpalo362я сам новый в изучении, так что поправте если не так ;) Зачем нам статические поля? По сути мы создаём динамический массив, по которому можно будет ходить с помощью указания по индексу(по типу lst[1]) и естественно, у каждого объекта класса должен быть свой собственный счётчик, который будет содержать количество каких-либо значений именно у определённого объекта. А если сделать поле статическим(я не уверен будет ли это работать именно так), то поле будет единым для всех объектов, в теории.. если мы создадим 2 объекта с типом List с запихаем туда по 2 элемента в каждый, то счётчик будет равен 3(с нуля считаем кнчн), в этом случае мы сможем обратиться к lst[2] или lst2[3] и в обоих случаях получим ошибку. Надеюсь, что понятно объяснил, удачи и вам в изучении!
@borisblade1403
@borisblade1403 2 года назад
Не дописана логика оператора[ ], который всегда должен что-то возвращать.
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
@borisshabanov6702
@borisshabanov6702 6 лет назад
Зачем создавать шаблонный Node, когда он и так объявлен в шаблонном List. Тип T для всех будет один, разве нет?
@zaramar8250
@zaramar8250 6 лет назад
нет
@borisshabanov6702
@borisshabanov6702 6 лет назад
Миша Якименко я проверил, лишний шаблон не нужен
@masasikisimoto26
@masasikisimoto26 5 лет назад
@@borisshabanov6702 у меня тоже так сработало, не пойму смысла Node делать шаблонным. В code::blocks вообще ошибку выдает.
@kosmoz8131
@kosmoz8131 2 года назад
Более того компилятор не запускает программу , так как не может понять параметр T, я пишу в code blocks, может в studio по другому
@nikita3471
@nikita3471 6 лет назад
Посоветуйте, пожалуйста, источники с обучением программированию на языке java script.
@sergeiivanov5739
@sergeiivanov5739 6 лет назад
Nikita klinchev w3school
@kaynsolo
@kaynsolo 6 лет назад
Very available explained!Like!
@jangiryanarsen4952
@jangiryanarsen4952 6 лет назад
Просто безумно интересно, продолжай в таком же духе Сергей!!! От меня лайк.
@KurpatovInstagram
@KurpatovInstagram 6 лет назад
Спасибо!
@_mirai
@_mirai 5 лет назад
А меня одного беспокоит, что к примеру в этом моменте: "head = new Cell(data);" или в этом "current->pNext = new Cell(data);" динамическая память выделяется, но не освобождается, и мы все равно компилируем проект? Я конечно мог что-то упустить или не понять, но все же
@impossible2hn614
@impossible2hn614 6 лет назад
Зачем ты в циклах for меняешь тип size_t на int? size_t это же беззнаковый int, а в цикле обычно не используются отрицательные числа.
@АндрейНауменок
@АндрейНауменок 6 лет назад
а должен ли оператор квадратных скобок возвращать что либо если по какой либо причине индекс выходит за размер листа? (ну, имхо, я проверял бы как-нибудь)
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
Можно проверять и бросать exception в случае выхода за границы списка, но это уже тонкости реализации.
@bielozorov
@bielozorov 6 лет назад
Не понимаю как двигается pNext ?
@СправаФея
@СправаФея 6 лет назад
здесь сбивает с толку сам current. это - указатель на нод. т.е., когда нам надо - мы записываем с помощью него поле pNext в нод, на который он сейчас указывает (current->pNext = new Node(data);). в то же время, когда нам надо - он сам (current) переписывается: current = current->pNext; (в него записывается другой адрес, и указывает он теперь на другой нод). две разные операции с одним current сбивают с толку,
@dedreddead
@dedreddead 5 лет назад
@@СправаФея намного выгоднее завести отдельный указатель на конец списка (tail) и без этого цикла сразу полю next этого указателя присваивать новый node. И затем просто переставить указатель на конец списка этому новому node. if (head == nullptr) { head = new node(elem); tail = head; } else { tail->next = new node(elem); tail = tail->next; }
@ИльдарБулатов-л9й
@@dedreddead, там тогда пропадет указатель head, в рамках двусвязного ещё можно попробовать, но ни как не в односвязном
@kir6052
@kir6052 Год назад
Конечно, поздновато реагирую, но я вот тут подумал. Разве выводить элементы через оператор перегрузки не дольше? Нам для каждого индекса нужно с нуля до индекса идти, получается O(N^2). В то время как без операторов перегрузки, простым прогоном по листу, вывод займёт лишь O(N). Я нуб, так что поправьте, пожалуйста.
@СветланаХомякова-в1ъ
У меня возникает ошибка Declaration of template parameter T shadows template parameter. Она возникает в том месте, где я объявляю класс Node - я придумала для параметра другое имя: template class Node{ ... - после этого ошибка пропала. Зато она появилась в других местах: в объявлении конструктора, деструктора и метода push_back template List::List(){ Не понимаю, почему так? И почему у Вас она не появляется?
@СветланаХомякова-в1ъ
Нашла причину. Не хватало скобки, закрывающей. Которая завершала бы описание класса List.
@vitusink6445
@vitusink6445 4 года назад
Вы говорите что прошлый урок №132 посвящен теоретической части односвязного списка. Но он посвящен: "Динамический массив и умные указатели"
@RemboZSU
@RemboZSU 6 лет назад
Спасибо большое за урок. Преподы не могут так объяснить как вы!)
@МаксимПритолюк
@МаксимПритолюк 4 года назад
Подскажите, пожалуйста,в каких уроках начинается синтаксис типа "current->data"?
@БогданКравченко-я5ъ
template T& List::operator[](const int index) { int counter = 0; Node *current = this->head; while (current != nullptr) { if(counter == index) { return current->data; } current = current->pNext; counter++; } } В реализации перегрузки этого оператора возникает ошибка: Control may reach end of non-void function Подскажите, пожалуйста!
@Andrey-qj9sj
@Andrey-qj9sj 4 года назад
Тоже самое, нашёл в чем ошибка?
@БогданКравченко-я5ъ
Immortal Andrey ну смотри, я просто сделал return counter. Выдаёт просто ворнинг, но нормально компилирует. Что бы убрать ворнинг - можно сделать static counter. Но тогда будет компилиться неправильно. В итоге оставил 1 вариант🤷🏼‍♂️
@saint8283
@saint8283 6 лет назад
T data = T() Что-то я не понял синтаксиса.
@СправаФея
@СправаФея 6 лет назад
здесь вызывается конструктор по умолчанию "этого" типа данных, и инициализирует переменную data "своими нулями". что бы проще было понять, можешь попробовать, например, такую конструкцию: int a = int(); - здесь в переменную "а" запендюрится его интовый 0,
@nozim_r2270
@nozim_r2270 4 года назад
@@СправаФея а если класс передать?
@user0tgvyjfc
@user0tgvyjfc 2 года назад
Классное видео! Кстати можно было избежать цикла while при добавлении не первого элемента в push_back, например, объявив Node* last рядом с head и далее использовать в push_back.
@nikitasuyazov2060
@nikitasuyazov2060 2 месяца назад
Тема, мягко говоря, не простая. Много новой информации сразу.
@Стримеригр-ы6о
@Стримеригр-ы6о 4 года назад
этот чувак просто гений у него есть настоящий дар учителя потрясающий контент!
@paulsound8430
@paulsound8430 2 года назад
Разобрал я этот пример и подумал про себя а умно все это сделано=)
@vitalyvolovodenko3473
@vitalyvolovodenko3473 5 лет назад
Уроки крутяк. Но если в списке один элемент, и мы захотим его получить, то походу мы ничего не получим
@anisaalsabri
@anisaalsabri 5 лет назад
А как реализовать “Очередь” на основе односвязного списка? Это как вообще? Что-то логику не поняла
Далее
Хэш-таблицы за 10 минут
13:01
Просмотров 129 тыс.
Собеседование Junior C++
45:32
Просмотров 116 тыс.
Premature Optimization
12:39
Просмотров 813 тыс.
Алгоритмы на Python 3. Лекция №1
1:20:50