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

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

Комментарии • 354

  • @viktoriiavolkova756
    @viktoriiavolkova756 6 лет назад +280

    Спасибо вам большое. Я сама студентка и нам сказали лабы писать на С++, теперь вся група смотрит вас и учиться. Вы хорошо рассказываете, понятно. Спасибо.

    • @SimpleCodeIT
      @SimpleCodeIT  6 лет назад +17

      Пожалуйста!

    • @user-le7wn3tb3c
      @user-le7wn3tb3c 6 лет назад +5

      +

    • @user-mm8hc5uu1e
      @user-mm8hc5uu1e 4 года назад +2

      @@SimpleCodeIT Сергей, подскажите, пожалуйста, в каком уроке появился синтаксис типа "current->pnext" или "current-> data" 20:34

    • @shoorikefimov6759
      @shoorikefimov6759 4 года назад +28

      @@user-mm8hc5uu1e Урок про указатель this №94.
      Коротко: с прототипа класса к полям обращаемся через точку, с указателя через ->
      Node current;
      current.pNext;
      Node *current;
      current->pNext;

  • @brennydit
    @brennydit 5 месяцев назад +17

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

  • @user-ut7tj6bp4t
    @user-ut7tj6bp4t 4 года назад +33

    Очень полезный урок. Ребят, если вы переписывайте код, то не забывайте его комментировать во-первых для того, чтобы самому лучше понять как и что работает, а во-вторых, чтобы при просмотре вашего кода, например через месяц, вы не путались в огромном количестве строк кода.
    А также не забывайте комментировать и ставить лайки под такими видео, чтобы увеличить их популярность.

  • @Son-of-the-God---
    @Son-of-the-God--- 2 года назад +16

    Памятник при жизни Сергею поставлю!!! Спасибо вам Сергей за ваши труды, здоровья вам и вашим близким, долгих лет жизни, и хороших людей рядом!!!

  • @SeshAlex
    @SeshAlex 6 лет назад +75

    Спасибо за урок! Для учащихся - в процессе урока пишите код, на не понятных моментах делайте паузы и перебирайте код отладчиком или глазами, так легче мозг принимает информацию.

  • @SimpleCodeIT
    @SimpleCodeIT  6 лет назад +203

    *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 по другому

  • @stephandolskii7964
    @stephandolskii7964 2 года назад +11

    Я не знаю, как бы я изучил ЭТО без таких прекрасных объяснений. Это шедевр

  • @neverhoodJK
    @neverhoodJK 6 лет назад +13

    ну ты дал, Сергей!:)) загрузил так загрузил:) самое удивительное, что я все понял, а я новичок в этом) Спасибо! и присоединяюсь про бабосы с первой зп. Это заслуженно 100%.

  • @akkh6971
    @akkh6971 2 года назад +6

    Не описать словами чувство удовлетворения от понимания устройства односвязного списка после ваших разъяснений! Спасибо большое!

  • @user-ic3kv9oz3g
    @user-ic3kv9oz3g 3 года назад +11

    Вообще не знаю, как бы я понимал программирование без Сергея. Спасибо, друг.

  • @user-nw5iw5ew9z
    @user-nw5iw5ew9z 2 года назад +5

    Спасибо за столь не простой урок. По уровню сложности я бы его оценил как урок про конструкторор копирования. Однако, пересматривая урок по несколько раз с каждым разом, понимание становится лучше и лучше.

  • @mykhailomorhal2181
    @mykhailomorhal2181 6 лет назад +331

    Обещаю часть своей первой зарплаты (от работы програмиста) отправить вам на поддержку канала!

    • @user-ku8jc7lt9b
      @user-ku8jc7lt9b 6 лет назад +22

      Присоединяюсь, отличная идея!

    • @llllNEOllllchannel
      @llllNEOllllchannel 6 лет назад +28

      peace да ball

    • @iii-mk7no
      @iii-mk7no 4 года назад +64

      @Artur Golovenko Тебе так хочется верить. Я отучился на программиста, за 5 лет обучения я знаю меньше чем с уроков ютуба(т.к там преподу пофигу знаешь ты или нет. Он приходит сидит там мямлет что то себе под нос, читая слайд шоу. На ютубе ты можешь выбрать канал, а препода в универе нет.При обучении я просто ненавидил с++.) Конечно нужно еще почитать кое какой инфы и книг, много гуглить, много проб и ошибок. Этот диплом, что я получил мне абсолютно никакой пользы не принес. Работаю не по специальности. Данная работа мне приносит, для моего опыта и возраста колоссальный доход ,какие то цифры я приводить не буду, дабы тут не хвастаться не перед кем. Но у данной моей работы есть огромные минусы. Она очень тяжелая, много грязи, и еще связана с командировками(причем бывают и по пол года). Поэтому я решил вернуться к истокам с чего и начинал, к программированию. Смотря курс Сергея(ему огромное отдельное спасибо!!!!). Я постиг много во, теперь действительно могу что то написать. Читаю книги Бьерна Страуструппа, все свое свободное время просто вкладываю в обучение. Учу параллельно английский. Главное вера в себя, хорошая усидчивость, голова на плечах и руки не из одного места:) Сергею еще раз большое спасибо, из всех просмотренных мной каналов это самый лучший. Он действительно хорошо все объясняет, как говорят, нам все разжевал - осталось только в рот положить. По сравнению с тем же Дударем(давайте создадим переменную, а хотя можно и не создавать) - его смотреть это когда все знаешь.

    • @avocadoman6038
      @avocadoman6038 4 года назад +8

      @@iii-mk7no Ну, как бы суть современного высшего образования в том, что тебе указывают нужное направление, а дальше ты сам в интернете и библиотеках учишься.

    • @mykhailomorhal2181
      @mykhailomorhal2181 4 года назад +19

      @@jojomajo 1) Російська мова не є моя рідна 2) Гроші я переказав, можеш спитати у автора 3) Зараз працюю в Європі айтішніком :) За допомогою цього вже всю Європу об'їздив, фотки вислати?)

  • @user-zt5hj1um5l
    @user-zt5hj1um5l 3 года назад +2

    3 часа бился над ошибкой, почему не выводит результат lst[2], при этом забыв завести команду lst.push_back(22). Только отладчиком понял, что условие if не возвращает результат, потому что 3 переменную листа не завёл)) Кстати в кодблокс пришлось у Node делать тип T1, иначе не работает. Спасибо комментариям снизу. Тема обсуждалась, когда число подписчиков было 10 тыс, а я смотрю когда уже 233 тыс. Спасибо, Сергей за отличные уроки. Надеюсь через год переквалифицируюсь из инженера-конструктора в программисты.

  • @hotabmax6431
    @hotabmax6431 4 года назад +42

    Мы создаём объект List. Внутри объекта лист счётчик и капсула Node с адресом следующей капсулы и данными. Функция push_back создаёт указатель на первую капсулу. Если адрес следующей капсулы равен нулю, то в переменной pNext мы создаём новую капсулу, если же там есть адрес то мы перебираем все адреса путём присваивания из капсулы head параметра pNext следующего адреса в переменную current. И так пока адрес следующей капсулы не будет равен 0. И опять же дойдя до этого элемента присваиваем в параметр pNext следующую капсулу. 3 дня ушло чтобы это всё понять)

    • @user-oo9tn8fj7i
      @user-oo9tn8fj7i Год назад +1

      Привет а зачем нужно создавать временный указатель(current) ?

    • @Jeff-cn4sf
      @Jeff-cn4sf Год назад

      @@user-oo9tn8fj7i она типа временная, я тоже задался этим вопросом. Попробовал сделать без нее используея this->head ну и это даже не компилилось)
      Это позволяет, я так понял, обращаться по очереди к каждому адресу это в случае перегрузки operator[], а в PushBack() это позволяет последовательно создавать новые элементы списка. Трудно объяснить к сожалению, но отладчиком все хорошо можно проследить)

    • @nick-ei2og
      @nick-ei2og Год назад

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

    • @Lol-nz7fn
      @Lol-nz7fn Год назад

      @@nick-ei2og Сказал человек, который растянул мысль на целый параграф)))

    • @Lol-nz7fn
      @Lol-nz7fn Год назад +1

      @@user-oo9tn8fj7i Указатель current мы создаём потому что он перебирает все элементы, тем самым присваивая себе эти элементы по очереди, пока не дойдёт до последнего элемента и дальше не создаст новый(речь идёт о Push_Back), а head нельзя изменять потому что это начальный элемент

  • @maxamly
    @maxamly 5 лет назад +4

    Господи это реально лучший канал по си плюсам, Чувак ты лучший❤️❤️❤️

  • @rudthakyred_alert6359
    @rudthakyred_alert6359 2 года назад +21

    Не знаю как в 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 2 месяца назад

      Огромное спасибо. Очень выручил!

  • @nap0le0nb0naparte7
    @nap0le0nb0naparte7 6 лет назад +11

    Спасибо большое Сергей за реализацию списка!

  • @darth_kenobi4136
    @darth_kenobi4136 2 года назад +2

    Для тех кто не понял как работает pNext:
    while просматривает значение current->pNext, если оно не nullptr то берет значение адреса памяти следущего елемента.
    а присваиваеться это следущее значение текущему в функции push_back этими строчками:
    Node* current = this->head;//создаеться указатель на первый указатель класса
    если у первего указателя переменная pNext = null; то создаеться новый екземпляр класса Node с pNext = null, а pNext у head(если изменить значение у указателя то значение основного обьекта также смениться) становиться равным адрессу памяти нового екземпляра при помощи:
    current->Nextptr = new Node(data);
    и так можно добавлять елементы до бесконечности, каждый елемент будет хранить указатель на следущий

  • @user-qb8um2ec4c
    @user-qb8um2ec4c 4 года назад +1

    этот чувак просто гений у него есть настоящий дар учителя потрясающий контент!

  • @KurpatovInstagram
    @KurpatovInstagram 6 лет назад +8

    Спасибо!

  • @alexshyshkov3919
    @alexshyshkov3919 6 лет назад +22

    видео класс, жду уроков про очередь и бинарное дерево)

  • @overdoses1794
    @overdoses1794 6 лет назад +17

    Уважаемый, Сергей! 10к подписчиков, с чем я вас сильно поздравляю=). Надеюсь ролик о том, как вы стали программистом монтируется(просто не терпится послушать).

    • @SimpleCodeIT
      @SimpleCodeIT  6 лет назад +7

      Спасибо! Я всё помню, ролик будет завтра.

  • @user_x138
    @user_x138 3 года назад +2

    Я устал пересматривать этот урок. Уже сотый раз прохожу отладчиком по коду, чтобы уяснить логику. В прошлый раз такая же проблема была на перегрузке конструктора копирования. Осилил его - осилю и этот. Сергей ты лучший

  • @user-bc4vi6hl2f
    @user-bc4vi6hl2f 6 лет назад +9

    Спасибо за урок

  • @user-pd4gt9zz9c
    @user-pd4gt9zz9c 6 лет назад +3

    В очередной раз огромная благодарность Вам за доходчивое разъяснение и внятный, толковый пример.

  • @jangiryanarsen4952
    @jangiryanarsen4952 6 лет назад +8

    Просто безумно интересно, продолжай в таком же духе Сергей!!! От меня лайк.

  • @SimpleCodeIT
    @SimpleCodeIT  6 лет назад +13

    #односвязныйсписок #динамическиеструктурыданных #SimpleCode #урокипрограммирования

  • @paulsound8430
    @paulsound8430 2 года назад +1

    Разобрал я этот пример и подумал про себя а умно все это сделано=)

  • @Lol-nz7fn
    @Lol-nz7fn Год назад

    Блин, ну вроде бы понял как это всё работает, спасибо Сергею за такой труд)

  • @observer7742
    @observer7742 Год назад

    Огромное спасибо! Отличные, понятные, содержательные уроки. Очень полезно!

  • @andrewbistroff1199
    @andrewbistroff1199 6 лет назад +5

    Спасибо за урок!

  • @user-nd4sl1lp9b
    @user-nd4sl1lp9b Год назад +1

    Спасибо за разъяснение.Всё толково и понятно!❤

    • @Hikikomori123
      @Hikikomori123 9 месяцев назад

      чего добился за эти 5 мес?

    • @user-nd4sl1lp9b
      @user-nd4sl1lp9b 9 месяцев назад

      ​@@Hikikomori123всё работает хорошо.Список у меня из структур.Хотел что бы происходила сортировка по какой либо записи структуры,но пока не знаю как используя стандартные средства среды это сделать?

  • @sergeysitenko
    @sergeysitenko 4 года назад +19

    У вас в плейлисте "Основы C++. Программирование для начинающих" не хватает теории про односвязный список. (то что ссылка в описании видел)

    • @user-r5jflfskjlaJJFs
      @user-r5jflfskjlaJJFs Год назад +1

      и весь остальной плейлист про динамические структуры данных

  • @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. Такой вариант кода позволяет не пробегать по всему списку каждый раз, когда элемент надо добавить вниз.

  • @thetiphon
    @thetiphon Год назад +2

    Я думаю объект типа T в функцию push_back надо передавать по ссылке, а не по значению.
    А то получается ты копируешь объект 3 раза: из main в push_back, из push_back в конструктор Node и из конструктора Node в переменную data класса Node

  • @pashastatch8313
    @pashastatch8313 5 лет назад +3

    Сегодня на собесе загрузили по данной теме, хотя опыт 20 лет на сях. Всегда есть чему учится.

  • @alexandrkryvopust7505
    @alexandrkryvopust7505 2 года назад +1

    Может кому-то будет изначально не понятно как и мне. Указатель head содержит адрес по которому одновременно хранятся данные + указатель на следующий элемент. Соответственно когда в функции push_back мы создаем указатель current то в него попадает, то что лежит по первому элементу List (это два поля данные и указатель(который, для случая, что у нас только 1 элемент листа все еще равен nullptr). Затем мы в поле указателя ячейки листа у которой поле указателя на следующий элемент равно nullptr присваиваем адрес данных (новая ячейка) которую мы функцией Push_back добавляем.

  • @user-kp9hh9ox1i
    @user-kp9hh9ox1i 6 лет назад +4

    классный урок, спасибо Сергей!

  • @RemboZSU
    @RemboZSU 6 лет назад +2

    Спасибо большое за урок. Преподы не могут так объяснить как вы!)

  • @billlanc9461
    @billlanc9461 2 года назад

    Пришел из курса по C#. Тема Рекурсия. Плюсы таки сложнее шарпа, но смотреть интересно. Автор канала крут!

  • @tyomka4265
    @tyomka4265 6 лет назад +5

    очень интересно

  • @user0tgvyjfc
    @user0tgvyjfc 2 года назад +1

    Классное видео! Кстати можно было избежать цикла while при добавлении не первого элемента в push_back, например, объявив Node* last рядом с head и далее использовать в push_back.

  • @ilyat7109
    @ilyat7109 4 года назад +6

    Данная программа не компилируется, выдается ошибка (declaration of template parameter 'T'). Проверил в нескольких компиляторах везде одна и та же ошибка. Как её решить? А главная, почему программа в ролике вообще компилируется ???????????????

  • @segars9604
    @segars9604 9 месяцев назад

    Спасибо за бесценный труд!)

  • @user-yw9bq1pt9v
    @user-yw9bq1pt9v Год назад +1

    Огромное спасибо !!!!

  • @pavelios3577
    @pavelios3577 5 лет назад +2

    Спасибо за урок.

  • @vladalu9794
    @vladalu9794 6 лет назад +7

    спасибо большое, очень понравился урок, продолжай в том же духе!!!

  • @user-os5ee2fg9d
    @user-os5ee2fg9d 5 лет назад +1

    Спасибо за отличный урок!

  • @alexandrkarpov4544
    @alexandrkarpov4544 3 года назад +2

    Спасибо за уроки, Сергей! Надеюсь еще читаете эти комментарии.
    Такой вопрос:
    Решил после просмотра серии уроков про список, написать самостоятельно по полученным знаниям свой класс списка. И на моменте описания перегрузки оператора [ ] у меня получились расхождения с вами.
    В моем случае я эту перегрузку описал так:
    template
    T& List::operator[](int index)
    {
    int counter = 0;
    Node* current = head;
    while (counter != index)
    {
    current = current->pNext;
    counter++;
    }
    return current->data;
    }
    Подскажите, как мне кажется мой вариант более компактный, однако он допускает значения индекса больше, чем список имеет значений. И в случае превышения индекса программа завершается с ошибкой, как это было бы с обычным массивом, выйдя за его пределы. В вашем же случае, при выходе за границы результат всегда будет 0.
    Помню вы говорили, что лучше если программа завершится с ошибкой, чем выдаст какое-то значение, из-за которого дальнейшая работа будет некорректна и мы устанем искать причину такого поведения.
    Собственно вопрос, как лучше описывать эту перегрузку?)

    • @user-r5jflfskjlaJJFs
      @user-r5jflfskjlaJJFs Год назад

      Node *current = this->head;
      for (int i = 0; i < index; i++)
      {
      current = current->pNext;
      }
      return current->data;
      Я описал это вот так. Но в моём случае при отрицательном значении индекса оператор возвращает первый элемент списка. Но не думаю, что это большая проблема

  • @prostocrazy1105
    @prostocrazy1105 Год назад +2

    я целых часов 5 наверное сидел и перетирал что вообще происходит(в частности с тем откуда 2 поля(pNext) у 1 переменной )

  • @sofafrom1047
    @sofafrom1047 Год назад

    Это просто нереально полезный для меня урок

  • @ertargn
    @ertargn 6 лет назад +4

    спасибо чувак.. сними уроки для c#. буду благодарен

  • @_girnetix_
    @_girnetix_ 2 года назад +2

    Было бы неплохо добавить указатель на последний элемент этого списка, т.к. при больших значениях узлов такого списка, его создание займёт огромное количество времени

  • @borisshalabanov4620
    @borisshalabanov4620 6 лет назад +7

    спасибо

  • @user-vf9gm9zn4x
    @user-vf9gm9zn4x 4 года назад

    в реализации оператора индексации, после цикла while желательно написать обработку ситуации, когда индекс меньше количества элементов. Т.е.
    while(current!=nullptr) выполнится раньше, чем найдем индекс.
    Обычно компиляторы такой код не компилят, но х3. Спасибо, брооо

    • @eninyri
      @eninyri 3 года назад

      а не должно быть - while(current->Nextptr != nullptr) ?

  • @dedreddead
    @dedreddead 5 лет назад +3

    По-моему намного выгоднее завести отдельный указатель на конец списка (tail) и без этого цикла сразу полю next этого указателя присваивать новый node. И затем просто переставить указатель на конец списка этому новому node.
    if (head == nullptr) {
    head = new node(elem);
    tail = head;
    }
    else {
    tail->next = new node(elem);
    tail = tail->next;
    }

  • @kaynsolo
    @kaynsolo 6 лет назад +3

    Very available explained!Like!

  • @shutup-kc5ud
    @shutup-kc5ud 3 года назад

    Благодаря вам сдала лабу по программе, большое спасибо ~

  • @TGrod
    @TGrod 3 года назад

    Ну push_back можно было бы оптимизировать. Просто в list хранить ещё и указатель на последний элемент. Далее мы в поле последнего элемента приравниваем новый указатель new Node (data), после чего просто в указатель в List мы приравниваем вновь созданный указатель

  • @user-rv9ss5ce7z
    @user-rv9ss5ce7z 6 лет назад +3

    Серега спасибо!

  • @user-jm5dk2nh7t
    @user-jm5dk2nh7t 5 лет назад +1

    Урок предельно понятный и информативный, но нужно еще и самому всё это написать и пробежаться отладчиком.

  • @alexkuyrib2580
    @alexkuyrib2580 4 года назад +1

    большое спасибо за урок!!! Удачи Вам) а каналу 500К подписчиков!!!

  • @SeshAlex
    @SeshAlex 6 лет назад +3

    Кстати. Запустил прогу, вписал 50 тыщь, и консоль затупила)) Теперь я понял в чем разница списка и массива. Массив быстрее работает с большими индексами.

    • @user-yn7gi6os8d
      @user-yn7gi6os8d 3 года назад

      Ахахахах, тоже показательный пример

  • @RensetVideos
    @RensetVideos 6 лет назад +3

    Спасибо за урок, но было бы лучше, если на простые вещи было бы меньше акцента, а на более сложные - больше.

  • @user-pv8ir9py9b
    @user-pv8ir9py9b Год назад

    Отличный курс!!!!!!!!!!!!!!!!!

  • @armm6437
    @armm6437 2 года назад

    Мощно)2 ой день уже смотрю)

  • @andrytitoruk4205
    @andrytitoruk4205 4 года назад +6

    невозможно преобразовать аргумент 1 из "Т" в "List::Node *"

    • @Andrey-qj9sj
      @Andrey-qj9sj 4 года назад

      Нашёл решение?

    • @andrytitoruk4205
      @andrytitoruk4205 4 года назад

      @@Andrey-qj9sjнет

    • @oljaolsa7261
      @oljaolsa7261 4 года назад +2

      поміняй місцями параметри в класі нут в круглих дужках
      спочатку напиши T data=T() а потім Node *pNext

    • @user-vt1qt3ub1q
      @user-vt1qt3ub1q 4 года назад +1

      @@oljaolsa7261 Вы серьезно думаете что все знают укр язык?

    • @user-vt1qt3ub1q
      @user-vt1qt3ub1q 4 года назад

      Код целиком скинь

  • @user-gw4uc3gs7z
    @user-gw4uc3gs7z Год назад

    безмерная благодарность Тебе

  • @user-qj6tk5fw9p
    @user-qj6tk5fw9p 3 года назад +1

    даужь, начались наконец то уроки по сложнее

  • @C2H5OHH
    @C2H5OHH 3 года назад

    Thank you for the lesson!

  • @pashakkaa
    @pashakkaa 6 лет назад +4

    Автору огромное спасибо за урок! Скажите, пожалуйста, обязательно ли внутренний класс Node делать шаблонным? Ведь и класс List, и класс Node всегда будут работать с одинаковыми типами данных.

  • @MadRedMarx
    @MadRedMarx 4 года назад

    Главное, что определение методов внутри определения класса делает их встроенными, что не нужно в большинстве случаев. А уже потом это загромождает код.

  • @user-tb7yn5yy3g
    @user-tb7yn5yy3g 4 года назад +11

    мозг кипит)

  • @catastrophic3709
    @catastrophic3709 4 месяца назад +1

    Ребят, кто не понял, как так происходит присвоение, в конструкторе:
    Node(T data = T(), Node* pNext = nullptr)
    Тут прикол идёт прямиком из урока про параметры функций по умолчанию. Когда вы задаёте параметру присваивание, то вы тем самым, в этой функции можете не передавать данных, тогда функция по умолчанию выдаст то, что вы присвоили в параметрах. Например:
    void Foo(int a = 5). Это означает, что если вы напишете Foo()- не передадите каких-либо параметров, то парметр "а" в Foo(int a = 5), приймет значение 5. Если же вы впишете Foo(6), то "а" будет == 6. Я только сейчас понял, как работает конструктор Node.

    • @user-ln2qd8sy9z
      @user-ln2qd8sy9z 4 месяца назад

      Хоть ты что-то объяснил, а то этот об.мудок из видео при объяснении чего-то сложнее 2+2 плывёт и переходит на долгое объяснение очевидных вещей

    • @catastrophic3709
      @catastrophic3709 4 месяца назад

      @@user-ln2qd8sy9z Я лишь на 3-ей части реализации списка лишь понял, как оно работает. У меня так с конструктором копирования было, пока не посмотрел как сделать конструктор присваивания

    • @sleepyNovember_project
      @sleepyNovember_project 2 месяца назад

      Вот смысл лезть в такие темы как реализация динамической структуры данных, когда не знаешь такой базовой вещи как параметр по умолчанию? 🤨

    • @catastrophic3709
      @catastrophic3709 2 месяца назад

      @@sleepyNovember_project Ну в этом и заключается прелесть обучения, когда ты можешь найти ответ сам.

  • @Retyioaqe
    @Retyioaqe 5 лет назад +7

    Если выдает ошибку "error: declaration of template parameter 'T' shadows template parameter", то попробуйте назвать параметры по-разному: например T для class List и T1 для class Node.

    • @TheWladberlin
      @TheWladberlin 4 года назад

      Что-то все-равно не идет, та же ошибка

    • @TheWladberlin
      @TheWladberlin 4 года назад +3

      бл... я Т по ходу кириллицей писал! Теперь все норм.

  • @i4q236
    @i4q236 6 лет назад +7

    Сергей, привет! Спасибо за реализацию списка! Это твоё первое видео такой внушительной продолжительностью...насколько я помню было одно длительностью 30 минут конструктор копирования! Когда будешь записывать видео ответы на ваши вопросы озвучь, пожалуйста, с помощью какой программы монтируешь видео! Случайно не Sony Vegas Pro 13? ))))

    • @SimpleCodeIT
      @SimpleCodeIT  6 лет назад +4

      Пожалуйста! Монтирую с помощью Vegas Pro 14

  • @user-rq8db7oy3p
    @user-rq8db7oy3p 6 лет назад +16

    выдает ошибку error: declaration of template parameter 'T' shadows template parameter|

    • @assert_null
      @assert_null 4 года назад +7

      Потому что Node не должен быть шаблоном, если List - шаблон. Или, по крайней мере, имя шаблонного параметра у Node не должно совпадать с таковым у List. Но лучше все-таки первый вариант.

  • @mrrodman5265
    @mrrodman5265 5 лет назад +2

    Вопрос: как сохраняется указатель *current, который создался в методе push_back? Разве он не должен уничтожится когда мы выходим за область видимости?

  • @Amigo_GO
    @Amigo_GO 4 года назад +3

    20:42 Для тех кто решил запустить код на этом этапе и компилятор выдал ошибку: Нужно прописать деструктор класса List, хотя бы пустой.

    • @ryangosling7954
      @ryangosling7954 3 года назад

      Господи, чувак, спасибо большое! Деструктор у меня был, но похоже кривой, но заработало!

    • @shibu5180
      @shibu5180 Год назад

      спасибо

  • @araikrasoyan702
    @araikrasoyan702 5 лет назад +1

    Спасибо.

  • @aggressivnyy
    @aggressivnyy 4 года назад +1

    КРАСАВА

  • @user-ih8ov6uu6f
    @user-ih8ov6uu6f 5 лет назад

    Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка C2440 =: невозможно преобразовать "List::Node" в "List::Node *"
    with
    [
    T=int
    ]

    • @tapirskiy
      @tapirskiy 4 года назад

      та же ерунда

    • @love_skinny
      @love_skinny 6 месяцев назад

      В классе List в конструкторе Node в скобках напиши так: Node(T data=T(), Node* pNext = nullptr)

  • @user-tl9qe9hg5s
    @user-tl9qe9hg5s 4 года назад +2

    head = head->pNext;//head получает адрес следующего элемента списка
    Но где в коде описано когда этот адрес на следующий элемент получен? Когда head->pNext получило какое-то значение, а не nullptr?

  • @user-sr5qh2xj2g
    @user-sr5qh2xj2g 6 лет назад +5

    Если мы динамически выделяем здесь память, почему нет ее освобождения?

  • @user-hm7wm5pk5m
    @user-hm7wm5pk5m Год назад

    Я правильно понимаю, что pop_back невозможно сделать за O(1), так как даже, если у нас есть указатель на послед. элемент, то, имея односвязный список: []->[]->[]->nullptr , чтобы удалить последний нужно предпоследнему сделать nullptr, иначе будет висячий указатель(последний же удалится). Предпоследний же нужно также перебирать сначала списка.

  • @anastasiagolomazova4961
    @anastasiagolomazova4961 4 года назад +3

    Знаю вопрос глупый, но! Не могли бы вы объяснить почему мы не можем класс Node вписать вне класса List и потом просто к нему обращаться

  • @user-rj7cf4sf6d
    @user-rj7cf4sf6d 2 года назад +1

    8:20 не понял зачем это нужно? если мы передадим класс или любой другой тип данных,
    то у нас в любом случае переменная data будет инициализирована, так как в конструкторе this->data = data;
    Но вы сами сказали на 7:59 , что данных нет. в T будет храниться мусор.

  • @overdoses1794
    @overdoses1794 6 лет назад +11

    Это великая работа) Спасибо за урок, ради такого видео даже ляма лайков не жалко! Сергей, а почему многие ютуберы, те же самые форумы говорят, что ООП не нужно? Я не понимаю такой логики, тоже самое говорят про Java, ведь с++ основан на добавлении ОПП в язык Си?

    • @SimpleCodeIT
      @SimpleCodeIT  6 лет назад +13

      Большинство топовых языков программирования объектно ориентированные, в большинстве вакансий требуется знание принципов ООП. ООП удобно, понятно и громадное количество ПО написано с применением ООП, а этот код нужно поддерживать. Это так на вскидку. Так что ООП востребовано и будет востребовано ещё очень долго. Я не отношусь к противникам или последователям ООП или процедурного стиля, а принимаю это просто как инструменты которые могут быть удобны в той или иной ситуации. Всякие радикальные точки зрения считаю не соответствующими реальности фантазиями.

    • @overdoses1794
      @overdoses1794 6 лет назад +2

      Спасибо за совет, но просто обратил внимание и стало интересно, вот решил разузнать у опытного программиста=)

    • @overdoses1794
      @overdoses1794 6 лет назад +7

      Хороший ответ, почитав ваш комментарий я понял, что не только опытные программисты сидят на форумах, а ещё мамкины программисты. Я задал этот вопрос не потому что я пытаюсь как укоротить своё изучение, а для получения важной информации от вас, как от опытного программиста=) Благодарю за ответ, ваши видосики постоянно репостю(хз как это пишется=)))), дабы помочь вам и вашему хорошему каналу)

  • @Anatolii_V_Novikov
    @Anatolii_V_Novikov 11 месяцев назад

    Так вот почему делают итераторы - в частности, чтобы при последовательном выводе элементов списка (например, на печать) не искать элементы для каждого индекса заново и получить при этом O(n) вместо O(n^2).
    И, кстати, push_back() в ролике сделан со сложностью O(n) из-за того, что нет указателя на хвост head.

  • @sergeychernov5094
    @sergeychernov5094 3 года назад +1

    Ребята, подскажите пожалуйста, каким образом новый экземляр класса Node присваивается укателю header в области видимости метода pushback 16:30 строка 60 (Node* header = new Node(data)). Как это работает? Обычно к указателям можно присвоить ссылки.

  • @_mirai
    @_mirai 4 года назад +5

    А меня одного беспокоит, что к примеру в этом моменте: "head = new Cell(data);" или в этом "current->pNext = new Cell(data);" динамическая память выделяется, но не освобождается, и мы все равно компилируем проект?
    Я конечно мог что-то упустить или не понять, но все же

  • @higiro9333
    @higiro9333 3 года назад +5

    Окей, а что там с деструктором?

  • @TheWladberlin
    @TheWladberlin 4 года назад +1

    (16:15) - здесь ошибка. if (head = nullptr) -это не сравнение, это присвоение

    • @TheWladberlin
      @TheWladberlin 4 года назад +1

      :))) ок, понял, тороплю события (17:40)

  • @oraclevb5430
    @oraclevb5430 4 года назад

    лучший!

  • @user-pq5si5mk3z
    @user-pq5si5mk3z 11 месяцев назад

    спасибо.

  • @user-zd9pc1tk7r
    @user-zd9pc1tk7r 5 лет назад +2

    А если через оператор индексирования нужно вывести несколько элементов, как это сделать?

  • @koral7441
    @koral7441 Год назад

    Сложно, но понять можно!

  • @tonysile2906
    @tonysile2906 4 года назад +1

    Всё бы хорошо, но в списке добавление элемента происходит за константное время, в этом весь смысл списка. У вас же добавление за сделано за O(n)

  • @pavelnovikov3894
    @pavelnovikov3894 3 года назад

    браво

  • @jangiryanarsen4952
    @jangiryanarsen4952 6 лет назад +5

    Не видит шаблон template. Ошибка Declaration of 'T' shadows template parameter. Mac OS X 10.13.4 , cреда разработки XCode 9.3.
    Почему не видит, пока не пойму. Кто встречался с проблемой подскажите как решить. Cпасибо заранее.

    • @masasikisimoto26
      @masasikisimoto26 5 лет назад +3

      Мне помогло просто удалить строку 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 лет назад +1

      @@pruss_utb184 может ты просто забыл объявить конструктор List() внутри самого класса, в public секции. Или возможно просто забыл где ; поставить или скобку пропустил.

    • @pruss_utb184
      @pruss_utb184 5 лет назад +1

      @@masasikisimoto26 Верно: после упомянутой выше отладки, эта проблема все равно давала о себе знать и я в конце концов создал конструктор (а заодно - и деструктор) по умолчанию в public секции класса List. Дальше все работало нормально до самого конца.

    • @user-be7jw6nl1p
      @user-be7jw6nl1p 5 лет назад

      Такая же дичь , как решал ?