Вчера под первой частью написал, что ролик сделан "неплохо". Сейчас понимаю, что довольно сильно преуменьшил оценку. Очень хороший канал, годные ролики. Хорошо поставленная речь, хороший контент, хороший код (за исключением мелких помарок), подробные объяснения. В целом, отличный формат. За наглядную пошаговую демонстрацию процесса в отладчике - отдельный плюс.
В целом очень огромная проделана работа над этими уроками. Объяснения на высшем уровне, схватываю всё с первого раза. Единственное, что хотелось бы отметить как минусы, так это то, что все видео записаны в 25 кадров (отчего по началу глаза очень болели) и плохое качество микрофона (его фоновые шумы перебивают музыку на заднем плане, а в начальных видосах вообще крики детей на улице...)
@@Kellermans-p5r я - программист. Теперь моя очередь спрашивать. И вот мой вопрос: ты уверен, что автор не в состоянии сам ответить за себя и ему нужен адвокат в твоём лице?
4 дня просматривал первую часть об односвязных списках, сотни раз прогонял код через отладчик -какой итог? Наконец, понял всю суть указания на поля объекта через указатель с помощью оператора -> и даже сам написал метод для удаления последнего элемента в списке. Кайфы непередаваемые!!! Сергей, ты лучший.
@@maastm3760 К полям и методам объекта можно обращаться двумя способами: 1) Через сам объект. В этом случае используется точка. Например obj.method() 2) Через указатель на объект. В этом случае используется ->. Например pObj->method()
Огромное спасибо! Во многих случаях, что бы разобраться самостоятельно как работает подобная логика уходит много времени и нервов. С вашим каналом получаю огромное удовольствие от этих познаний.
Уже писали про проверку списка на пустоту. Кроме этого предлагаю сделать pop_front() булевым методом и тогда деструктор листа превращается в while(pop_front()){}
Отличные уроки! Под конец пошло самое интересное))) Но у меня есть вопрос (возможно он решён в третьем видео, но я пока его не смотрел). В методе pop_front() мы не делаем проверку head на nullptr. Из-за этого (вроде как) может выдаться ошибка в строке head = head->pNext; (68 строка), так как head равно nullptr, то мы не можем обратиться к полю pNext, так как его попросту нет P.S. Я создал эту ситуацию искусственно (так как лень было переделывать метод pop_front) и написал просто небольшой метод test в котором выводил адрес pNext у head (то есть: cout pNext
В методе pop_front(), наверное, было бы лучше, если мы сначала проверили наш список на пустоту. Поскольку вполне может быть, что у нас head указывает на nullptr. И когда мы создаем вспомогательный узел temp, которому присваем head->next, мы можем получить ошибку.
Функцию pop расписал слегка по-другому ( всегда пытаюсь сделать свой вариант потом смотрю по видео) , интересует верный ли мой вариант , все работает , на сколько я заметил , да и по логике правильно , кто разбирается скажите верен ли алгоритм void deleteEl() { Node *tmp = head->next; delete head; head = tmp; size--; }
delete не удаляет head, а очищает (освобождает) выделенную память, на которую указатель head указывает. после данной операции head продолжает указывать на ту же область память, но там уже находится мусор,) вспомни первые уроки про delete, nullptr, если же не смотрел - лучше посмотри,)
Здравствуйте строчки Node *temp=head; head=head->pNext; delete temp; //Мы в темп так ничего и не записали так как указатель на Head присвоили следующему элементу сраазу во второй строке Size--;
@@lehamoroz5306 Нет, не будет. Указатель temp как раз и указывает на бывший head (первый элемент) поэтому мы его, разумеется, можем удалить и через temp. Если та запись тебя ирритирует, то напиши по-другому: Node *temp; temp = head;
Если еще читаете тут коментарии, то почему не предусмотрели ситуацию в pop_front , когда не будет элементов, то если мы его вызовем, то head указывая на null , попробует обратиться к pNext и получим ошибку, или просто я чего то не понял?
Head = Head → pnext; Не совсем понятен этот синтаксис, что именно эта стрелочка означает. Подскажите, пожалуйста, какую тему загулить, чтобы разобраться?
Приветствую, я немного не понимаю, в односвязном списке элемент же добавляются в конец списка, а достаётся последний прибывший элемент(LIFO). А у вас первыми достаются элементы, которые первыми и пришли. Ведь так? Это же не LIFO...
понимаю, что поздновато пишу, но странно, что перед этой темой изучались умные указатели и тут как бы идеальная тема, чтобы их применить, но почему-то юзаются обычные указатели. Я в целом написал, тоже самое но с умными указателями и добавил несколько новых методов. Так как я не эксперт, у меня вроде все работает, но я не совсем понимаю как и точно ли правильно. Было бы круто сразу умные указатели применить на практике. (у все шаред, не совсем понимаю нужно ли где-то строить над ними вик или нет и точно ли чиститься память)
В методе pop_front указатель *temp указывает на первый элемент, если мы его просто так убиваем, разве первый элемент не будет продолжать висеть в воздухе?
В переменной *temp копия адреса на бывший первый элемент. И убиваем (освобождаем память по этому адресу) мы его после того, как первым элементом становиться второй.
Я, конечно, понимаю, что видео уже больше года и писать сюда не совсем актуально, однако видеть, что у него 1к лайков и всего 1 дизлайк - что-то невообразимое! Чур, дизлайк не мой! Я всегда под этим каналом лососи леплю!!!)))
Не знаю ответит ли кто то В коде pop_print void List::pop_front() { Node temp = head; head = head->pNext; delete temp; Size-- ; } Все правильно но много ошибок Писал весь код на Vs 2022
Наткнулся тут на видно, а есть ли результативная разница между удалением первого элемента на 8:07 и этим кодом ? void List::deleteFirstItem() { ListNode* temp = headList->pNext; delete[]headList; headList = temp; }
@@satyrosa, у меня код некорректный, как минимум delete[], как максимум удаление головы. Скорее всего, два года назад, я хотел провернуть штуку, как запомнить следующий элемент, удалить текущий и заменить удаленный следующим.
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
Большое спасибо, лайк поставил)))
Низкий поклон за ваши видосы! Это капец как выручает!
Вчера под первой частью написал, что ролик сделан "неплохо". Сейчас понимаю, что довольно сильно преуменьшил оценку. Очень хороший канал, годные ролики. Хорошо поставленная речь, хороший контент, хороший код (за исключением мелких помарок), подробные объяснения. В целом, отличный формат. За наглядную пошаговую демонстрацию процесса в отладчике - отдельный плюс.
В целом очень огромная проделана работа над этими уроками. Объяснения на высшем уровне, схватываю всё с первого раза. Единственное, что хотелось бы отметить как минусы, так это то, что все видео записаны в 25 кадров (отчего по началу глаза очень болели) и плохое качество микрофона (его фоновые шумы перебивают музыку на заднем плане, а в начальных видосах вообще крики детей на улице...)
А ты кто, чтобы говорить о его помарках?
@@Kellermans-p5r человек
@@-xavie9580 я не вам
@@Kellermans-p5r я - программист. Теперь моя очередь спрашивать. И вот мой вопрос: ты уверен, что автор не в состоянии сам ответить за себя и ему нужен адвокат в твоём лице?
4 дня просматривал первую часть об односвязных списках, сотни раз прогонял код через отладчик -какой итог? Наконец, понял всю суть указания на поля объекта через указатель с помощью оператора -> и даже сам написал метод для удаления последнего элемента в списке. Кайфы непередаваемые!!! Сергей, ты лучший.
Никак не могу понять для чего это ->, как и где оно используется, помоги!🥲🥺
@@maastm3760 Давно это было, уже забыл.
@@maastm3760 К полям и методам объекта можно обращаться двумя способами:
1) Через сам объект. В этом случае используется точка. Например obj.method()
2) Через указатель на объект. В этом случае используется ->. Например pObj->method()
@@МаксимКурасов-ы2у а ещё "pObj->method()" == "(*pObj).method()"
Огромное спасибо! Во многих случаях, что бы разобраться самостоятельно как работает подобная логика уходит много времени и нервов. С вашим каналом получаю огромное удовольствие от этих познаний.
Спасибо, стало понятнее как работает список в STL. Даёшь больше методов в списке!)
Отличный урок! Спасибо! Сергей, пожалуйста возобновите уроки по С++. Очень просим!
Что за магия? Смотрел, смотрел, и тут "И на этом, мы закончим наш урок...".
P.S. Время прошло приятно и незаметно.
Но ведь это всё можно было реализовать сразу в деструкторе))) Канал топ, всё доходчиво поясняет (даже со скоростью х2)) ). Продолжайте в том же духе)
Всё очень хорошо) благодарочка) хорошего Вам здоровья и долгих лет жизни)
Спасибо за бесценный труд!)
#односвязныйсписок #динамическиеструктурыданных #SimpleCode #урокипрограммирования
После первой части, вторая часть далась легче :D. Спасибо за урок, Сергей.
Включаю видос и автоматом ставлю лайк. Спасибо за уроки все предельно просто))
Огромное спасибо!!! Как всегда все предельно понятно))))
После первого урока смотрится на одном дыхании. Большое спасибо)
Вот честное слово что б я без этого канала делал))
Отлично объясняете))) Спасибо за урок!
Благодарю за урок!
большое спасибо! очень подробный и понятный гайд
Спасибо за урок
Спасибо-спасибо-спасибо!!! Лучшие уроки по программированию
спасибо Сергей!
большое спасибо за отличный урок!!!!
Спасибо за урок.
Спасибо!
еще один полезно-интересный урок:D
Спасибо за урок!
Огромное спасибо!)
Классный урок!!!Ты великолепен, сенсей.
Спасибо!!!
Thank you for the lesson!
Уже писали про проверку списка на пустоту. Кроме этого предлагаю сделать pop_front() булевым методом и тогда деструктор листа превращается в while(pop_front()){}
Отличные уроки! Под конец пошло самое интересное))) Но у меня есть вопрос (возможно он решён в третьем видео, но я пока его не смотрел). В методе pop_front() мы не делаем проверку head на nullptr. Из-за этого (вроде как) может выдаться ошибка в строке head = head->pNext; (68 строка), так как head равно nullptr, то мы не можем обратиться к полю pNext, так как его попросту нет
P.S. Я создал эту ситуацию искусственно (так как лень было переделывать метод pop_front) и написал просто небольшой метод test в котором выводил адрес pNext у head (то есть: cout pNext
Топово Обясняешь)
Благодарен
В методе pop_front(), наверное, было бы лучше, если мы сначала проверили наш список на пустоту. Поскольку вполне может быть, что у нас head указывает на nullptr. И когда мы создаем вспомогательный узел temp, которому присваем head->next, мы можем получить ошибку.
ok👊👊👊
Спасибо!)
спасибо)
Самое сложное в реализации подобного - создать каркас)
А дальше уже интуитивно додуматься можно
Двухтысячный лайк твой)
В методе pop_front не плохо было бы делать проверку на наличие хоть одной ноды, что бы не загнать size в минуса. Проще проверять (size > 0).
супер!
спасибо
Simple!
Я каждый раз как будто прозреваю после каждого ролика 😂
0 дизлайков!!! Красава, так даржать!
Да уж, незавидная судьба у переменной temp. Она жалкая пародия head, котрая нужна только для того чтобы ее удалили😢
3 человека так плакали из-за идеального объяснения, что промазали по кнопке лайка)
Функцию pop расписал слегка по-другому ( всегда пытаюсь сделать свой вариант потом смотрю по видео) , интересует верный ли мой вариант , все работает , на сколько я заметил , да и по логике правильно , кто разбирается скажите верен ли алгоритм
void deleteEl() {
Node *tmp = head->next;
delete head;
head = tmp;
size--;
}
delete не удаляет head, а очищает (освобождает) выделенную память, на которую указатель head указывает. после данной операции head продолжает указывать на ту же область память, но там уже находится мусор,) вспомни первые уроки про delete, nullptr, если же не смотрел - лучше посмотри,)
Здравствуйте строчки
Node *temp=head;
head=head->pNext;
delete temp; //Мы в темп так ничего и не записали так как указатель на Head присвоили следующему элементу сраазу во второй строке
Size--;
указатель *temp указывает на первый элемент, если мы его просто так убиваем, разве первый элемент не будет продолжать висеть в воздухе?
@@lehamoroz5306 Нет, не будет. Указатель temp как раз и указывает на бывший head (первый элемент) поэтому мы его, разумеется, можем удалить и через temp.
Если та запись тебя ирритирует, то напиши по-другому:
Node *temp;
temp = head;
"Мы в темп так ничего и не записали " - в каком смысле не записали? А это что:
Node *temp=head; ?
@@TheWladberlin а зачем на temp если мы с ним не чего не делаем, кроме того что создаём и удаляем? Можно ведь без него обойтись?
@@michaelivanov1605 мы очищаем память от head
Спасибо! Жесть)))
Тут уже мб писали, в pop_front нету проверки if (head != nullptr). Если попнуть несколько раз, имея в списке лишь 1 элемент, то будет ошибка.
Если еще читаете тут коментарии, то почему не предусмотрели ситуацию в pop_front , когда не будет элементов, то если мы его вызовем, то head указывая на null , попробует обратиться к pNext и получим ошибку, или просто я чего то не понял?
Всё правильно, надо ещё 2 строчки в начале метода добавить:) Автору огромное спасибо за уроки.
Pavlo Kornya получается надо проверить на то , что если указатель на head уже nullptr?
@@savinposter9816
Как решил проблему?
@@deletedaccount3077 так и проверил
Спасибо 2020
5:46 Все мы знаем, что хедшот наносит максимальный урон!
2021год , нету такого канала больше
Head = Head → pnext;
Не совсем понятен этот синтаксис, что именно эта стрелочка означает. Подскажите, пожалуйста, какую тему загулить, чтобы разобраться?
head->pNext; тоже самое что и head.pNext;
Ошибка C2446 ==: нет преобразования "const int" в "List::Node *" что єто такое и почему у тебя нет с етим проблем
Ошибка C2446 ==: нет преобразования "const int" в "List::Node *"
template
void List::pop_front()
{
Node *temp = head;
head = head->pNext;
delete temp;
Size--;
}
поставь *temp и всё решица
(НЕ ЗРЯ ТЫ ЖДАЛ 2 ГОДА)
Приветствую, я немного не понимаю, в односвязном списке элемент же добавляются в конец списка, а достаётся последний прибывший элемент(LIFO). А у вас первыми достаются элементы, которые первыми и пришли. Ведь так? Это же не LIFO...
Когда конец курса ? И какой новый курс ? С#?
ua-cam.com/video/EQdq3XxoJQQ/v-deo.html
Можно и так, наверное
void List::pop_front()
{
Node *temp = head->pNext;
delete head;
head = temp;
this->size--;
}
понимаю, что поздновато пишу, но странно, что перед этой темой изучались умные указатели и тут как бы идеальная тема, чтобы их применить, но почему-то юзаются обычные указатели. Я в целом написал, тоже самое но с умными указателями и добавил несколько новых методов. Так как я не эксперт, у меня вроде все работает, но я не совсем понимаю как и точно ли правильно. Было бы круто сразу умные указатели применить на практике. (у все шаред, не совсем понимаю нужно ли где-то строить над ними вик или нет и точно ли чиститься память)
Всё ясно и понятно,но вот код почти не видно из- за недофокусировки видеокамеры!
А как сделать удаление элементов по индексу???
а мы не можем обойтись без temp и удалить сразу head а потом ему присвоить следующий указатель на элемент?
Если сразу удалим head, то потеряем ссылку на следующую Node.
@@arranorun8808 спасибо!, Не подумал об этом
Указатель head удалять не нужно? В конце он будет равен nullptr, но у меня всё равно есть сомнения
В методе pop_front указатель *temp указывает на первый элемент, если мы его просто так убиваем, разве первый элемент не будет продолжать висеть в воздухе?
В переменной *temp копия адреса на бывший первый элемент. И убиваем (освобождаем память по этому адресу) мы его после того, как первым элементом становиться второй.
@@BrownAleks пол часа размышлял над этим в 4 часа ночи)спасибо!
@@michaelivanov1605 на здоровье. Наберитесь терпения, самое вкусное ещё впереди... =)
7:14 теперь можем наш temp безнаказанно удалить, как говорится temp в сделку не входил.
а где можно найти этот код?
Ручками, прямо с экрана конспектируй. Получишь массу удовольствия, практику и понимания логики происходящего. =)
в этом видео 1 дислайк, и поставил его Я) "нет я поставил лайк"
Я, конечно, понимаю, что видео уже больше года и писать сюда не совсем актуально, однако видеть, что у него 1к лайков и всего 1 дизлайк - что-то невообразимое!
Чур, дизлайк не мой! Я всегда под этим каналом лососи леплю!!!)))
1.5к лайков vs 1 дизлайк, это нечто)
@@faasfasasf8109 есть видосы до этого, где их было вообще 0.
2 года видосу, 2к лайков, 3 дизлайка ))
Уже 3(((
@@Yohimbex оторвать бы им руки
А если так ?
while (head!=nullptr)
{
pop_front();
}
Не знаю ответит ли кто то
В коде pop_print
void List::pop_front()
{
Node temp = head;
head = head->pNext;
delete temp;
Size-- ;
}
Все правильно но много ошибок
Писал весь код на Vs 2022
Node *temp = head; возможно *указатель пропустил), не проверял так что это не точно
Я очень люблю обезьян, я представляю их обнажёнными.............!!!!!!!
+
Наткнулся тут на видно, а есть ли результативная разница между удалением первого элемента на 8:07 и этим кодом ?
void List::deleteFirstItem()
{
ListNode* temp = headList->pNext;
delete[]headList;
headList = temp;
}
Нет
Извиняюсь, но разве мы можем присвоить значение уже удаленному указателю?
@@satyrosa, у меня код некорректный, как минимум delete[], как максимум удаление головы. Скорее всего, два года назад, я хотел провернуть штуку, как запомнить следующий элемент, удалить текущий и заменить удаленный следующим.
jr
1500 лайков и всего 2 дизлайка, вау
рандомный комментарий рандомный комментарий рандомный комментарий рандомный комментарий
Спасибо!
Спасибо за урок.
Спасибо за урок!
спасибо
спасибо