Qraizer
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору iamrecvezitor Давай смотреть. Цитата: nextSave = current->next; if(current->next == NULL) tail = current; | Нетрудно увидеть, что current->next и nextSave равны, благодаря первому присваиванию, поэтому условие будет истинным, только если это последняя итерация цикла. Значит весь if можно смело выкинуть из цикла, а присваивание tail-у просто поставить за его концом. Цикл у тебя имеет инвариант: в начале каждой итерации - current указывает на "новую" голову уже перевёрнутого списка, а nextSave - на остаток (хвост) ещё не перевёрнутого; в конце итерации к "новому" списку в голову добавляется указываемый предыдущим nextSave-ом, а сам nextSave перемещается дальше. Всё хорошо и правильно, за исключением того, что "новый" список не является списком - его последний элемент (бывший первый) ссылается не на NULL, а на предпоследний (бывший второй). Ты знакОм с концепцией отказоустойчивого (безопасного) программирования? Если нет, то познакомься, если да, то почему её не соблюдаешь? Конечно, NULL ему-таки присваивается Цитата: current = head; current->next = NULL; | но почему-то в самом конце, а не начале. Нелогично. Кроме того, если ты разворачиваешь список, то его новая голова - это по логике head, а новый хвост - это tail. А так как у тебя эти переменные используются, согласись, смущает. Итак, head - это голова списка. Для односвязного списка этого достаточно, т.е. tail избыточен. Даже бесполезен, наверное. Если head в "новом" списке станет хвостом, то он тоже будет безполезен, как в бывшем был бесполезен tail. Следовательно нет никакой причины иметь две переменные. Далее, current - это у тебя текущая голова (для текущей итерации) для "нового" списка. Т.к. head в цикле не используется, после цикла станет новой головой, а заNULLение хвоста списка мы вроде бы уже перенесли в начало алгоритма, получается, что и current не нужен, его вполне можно заменить head-ом. Если теперь всё это применить к твоему тексту, то получится как раз, как у меня с точностью до замены имён переменных. К чему это я собственно, чуть не забыл. Я не хочу сказать, что твой хуже (хотя несоблюдение логической целостности структур - это очень нехорошо), скорее, чуть сложнее и медленнее, однако мой фрагмент так же корректно отрабатывает ситуации с пустым списком, чего не скажешь о твоём. Непонятно, почему у тебя не вышло, как у меня - ведь в итоге твой текст получился эквивалентными моему. Добавлено: L0ST И правильно выдаёт. Не знаю, какого типа у тебя v3, но если не char huge*, то кастование к char huge* создаёт новую неименованную временную переменную, присваиваение которой бессмысленно, т.к. в конце выражения одна будет уничтожена. Чтобы было понятнее, рассмотри такой вариант своего кода Код: int v3; (double) v3 = 123.456; | Тоже не скомпилится.
---------- Одни с годами умнеют, другие становятся старше. |
| Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 18:45 04-06-2007 | Исправлено: Qraizer, 18:59 04-06-2007 |
|