![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
zabludshiy |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: MAX Репутация: ![]() ![]() ![]() |
Помогите добрые люди разобраться в следующей задаче: заполнить циклический односвязный список с зацикливанием «через голову». Дополнительные операции: a) добавить новый узел в хвост; б) вывести текущий список на экран ... примечание к задаче "Некоторые сложности представляет согласование типов указателей. Например, для инициализации пустого списка не всегда удается просто написать «Head := @Head», это может быть синтаксической ошибкой (в зависимости от настроек компилятора). Более корректно использовать явное преобразование типов: «Head := Link(@Head)». При этом важно, чтобы поле Next было обязательно описано как первое поле записи Node."
Прога получилась следующая:
Заполняется без зависаний и выпадающих ошибок, но когда список выводится происходит зацикливание. Не могу понять почему, нигде не могу найти ни ответа ни подобного примера. Помогите кто чем может!!! ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата repeat until P = link(L);должно отработать без зацикливания... Добавлено через 12 мин. Кстати, при удалении списка у тебя "течет" память. Причина - та же: procedure FreeList(var L: List); Так что перепроверяй все подобные конструкции (где сравнивается указатель и адрес)... Сообщение отредактировано: IUnknown - 8.11.2011 10:07 |
zabludshiy |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: MAX Репутация: ![]() ![]() ![]() |
Спасибо за ответ, зацикливание прекратилось, но вот интересная вещь происходит, когда например задать значение item=1, то выводится 1 ->0, если задать второе значение, то выводится 1->2->0, т.е. ноль всегда выводится в хвосте и откуда берется вообще непонятно. И подскажите, пожалуйста, что значит "течет память", может имеется в виду, что уменьшается размер кучи - свободной динамической памяти? (если вопрос глупый, не обессудьте, программированием недавно занялся)
|
IUnknown |
![]()
Сообщение
#4
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата что значит "течет память" Это значит, что не вся память, выделенная программой в куче, освобождена. Есть утечка: неосвобожденные участки памяти.В общем, чтоб убрать нули и избавиться от утечек, было проще заново переписать процедуру удаления списка, и переработать процедуру добавления: procedure FreeList(var L: List); Теперь нет лишних нулей, и утечки памяти тоже ликвидированы... |
zabludshiy |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: MAX Репутация: ![]() ![]() ![]() |
К задаче прилагалась схема, которую сразу не выложил (2 схема - структура списка, которую надо сделать), а приведенный код, как я понимаю, описывает структуру, изображенную на 1 схеме. Получается указатель next, который должен указывать на голову L, должен содержать адрес указателя L, т.е. @L, или "явное преобразование типов Head := Link(@Head)"?
Если я правильно понимаю задачу, надо добиться использования link(@L) вместо link(L), т.к. link(L) будет указывать на первую введенную переменную p:
, соответственно второй элемент списка будет указывать на первый элемент, а по условию задачи, он должен указывать на указатель-голову L. Помогите, пожалуйста, разобраться или подскажите, где я заблуждаюсь?! Сообщение отредактировано: zabludshiy - 8.11.2011 16:34 Эскизы прикрепленных изображений ![]() ![]() |
IUnknown |
![]()
Сообщение
#6
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Если я правильно понимаю задачу, надо добиться использования link(@L) вместо link(L) Нет. Использовать Link(@L) нельзя. Точка. Забудь об этом. Нельзя заткнуть рот компилятору насильным преобразованием какого-то постороннего значения к нужному тебе типу, и потом надеяться, что программа будет работать корректно.Цитата 2 схема - структура списка, которую надо сделать А какой смысл в этом? Сделать какой-то левый указатель, который бы указывал на весь список, но не имел бы ни поля Data, ни поля Next? Зачем он нужен тогда? Чтоб память позанимать лишнюю? Реализация будет вот такая (решай сам, надо оно тебе или нет) :program Lr_1; |
zabludshiy |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: MAX Репутация: ![]() ![]() ![]() |
Уважаемый Владимир, задачу я не выбирал, передо мной ее поставили, я ее и решаю, во всяком случае, пытаюсь изо всех сил
![]() Переработал свой код в соответствии с Вашим и получил следующую прогу:
В таком виде прога, насколько я понимаю, удовлетворяет условию задачи и схеме, и при этом корректно работает. Спасибо Вам, Владимир, за помощь!!! Сообщение отредактировано: zabludshiy - 8.11.2011 22:28 Эскизы прикрепленных изображений ![]() |
![]() ![]() |
![]() |
Текстовая версия | 31.07.2025 17:58 |