![]() |
Добро пожаловать, гость ( Вход | Регистрация )
Публикующим:
1. Задачу можно опубликовать двумя способами:
- создав для нее отдельную тему с информативным названием;
- добавив задачу в готовый сборник (например «Бескрылки», «Мини-задачи», «Вопросы ЧГК») или создав свой (например, «Загадки от /для Светы»).
2. Если вы публикуете задачу, решение которой не знаете, напишите об этом. По умолчанию считается, что вам известен правильный ответ и вы готовы проверять других игроков.
Решающим:
1. В темах запрещается писать ответы и подсказки, если возможность открытого обсуждения не оговорена отдельно (в случае открытого обсуждения для текста следует использовать цвет фона или белый, оставляя другим игрокам возможность самостоятельного решения).
2. Правильность решения можно проверить, написав личное сообщение автору.
![]() |
ierton |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Braingames Сообщений: 2 Регистрация: 12.8.2010 Пользователь №: 20 521 ![]() |
Весь форум не читал, прошу прощения если задача с бородой. Говорят, что спрашивали на собеседовании в гугле.
Нужно реализовать удаление элемента односвязного списка, имея только указатель на удаляемый элемент (известно, что он не является последним). Другими словами, нужно сделать так, чтобы предыдущий элемент стал связан с следующим за данным. Короче говоря: struct Item { void* data; struct Item * next; } ; void delete_item(struct Item * item) { ??? } Список конечный, признак последнего элемента - p.next == 0. Язык - С. |
![]() ![]() |
Alexandroppolus |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Модераторы BrainGames Сообщений: 973 Регистрация: 25.10.2009 Пользователь №: 17 196 ![]() |
Нужен элемент, предшествующий удаляемому.
Потому идем с начала списка, тогда либо начальный элемент соответствует item (в этом случае началом списка будет след. элемент, а этот просто удаляем из памяти), либо находим элемент, у которого next равен item (тогда присваиваем ему item->next, и удаляем item) |
ierton |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Braingames Сообщений: 2 Регистрация: 12.8.2010 Пользователь №: 20 521 ![]() |
Нужен элемент, предшествующий удаляемому. Потому идем с начала списка, тогда либо начальный элемент соответствует item (в этом случае началом списка будет след. элемент, а этот просто удаляем из памяти), либо находим элемент, у которого next равен item (тогда присваиваем ему item->next, и удаляем item) Нет, здесь идея именно в том, что указатель на начало списка неизвестен. Долговато Не проще ли, если у нас есть фактически ячейка памяти для Текущего элемента, записать в нее Следующий за ним(я боюсь писать код потому что меня бесят указатели), и тогда Предыдущий будет ссылаться сразу на Следующий? Да, это и есть решение ![]() Так, не понял, а где указатель на начало списка? Про него ничего не сказано... P.S. Понял, в этом вся фишка вопроса. Но в таком случае ответ не чистый. Никакой уверенности в том, что на указанные элементы не ссылается кто-то извне, нет. Стало быть этот момент нужно уточнять. Верно, гарантии нет. Но условие и не требует от решения каких-либо гарантий, лишь бы итоговый список оказался правильным. Боюсь, что если уточнять, то совсем очевидно станет. |
![]() ![]() |
![]() |
Упрощённая версия | Сейчас: 18.7.2025, 16:08 |