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;