Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача на динамическую память, зациклен ли однонаправленный список? 
:(
    Опции темы
Fardon
Дата 6.12.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.12.2009

Репутация: нет
Всего: нет



Всем добрый день.  
Препод по программированию задал задачку. Что-то никак не соображу, как решается.  
Задача по Динамическим структурам данных, по паскалю в частности. Хотя жёстко к языку не привязана. Так что интересует алгоритм решения а не реализация . Вообще задача вроде как стандартная и видел много вопросов по ней. Но вот  решения, которое подходит мне не нашёл. 
Есть однонаправленный список, который может быть зациклен  
Задание такое – определить зацикленный ли список? 
Данные и условия: 
user posted image 
Список может быть зациклен не только на предыдущий элемент.  Т.е решение запустить 2 прохода по списку с разным шагом в 2 не подходит. 
Перезаписывать, добавлять что-либо в самом списке нельзя. Т.е добавить флаг-" здесь мы были" нельзя. 
Создавать переменные, которые зависят от количества элементов в цикле нельзя. Т.е создать ещё список с пройденными адресами нельзя. 
Количество элементов списка (N) неизвестно. И максимальное количество проходов по списку, за которое точно можно будет сказать, что список не зациклен (или зациклен), не должно превышать N. Т.е тупой поиск в пройденных элементах использовать нельзя.  
Вродь всё)   
Я уже и не знаю что делать. Мож что-нить связанное с указателями и памятью тут? Помогите пожалуйста)
PM MAIL   Вверх
Pitlord
Дата 7.12.2009, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: нет
Всего: 7



А перед циклом сохранить указатель на текущий элемент списка нельзя?

Добавлено через 1 минуту и 5 секунд
Имею ввиду это:
Код

pointer = plist;
plist := plist^.next;

while ((plist <> nil) and (plist <> pointer)) do
begin
    plist := plist^.next;
end;

PM MAIL   Вверх
maxim1000
Дата 7.12.2009, 09:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



делаем два итератора по списку
в цикле один сдвигаем на один элемент, второй - на два
работаем, пока не дойдём до конца или не обнаружим, что оба итератора указывают на один и тот же элемент

расстояние между ними на каждом шаге увеличивается на 1, так что, когда номер шага кратен периоду, итераторы будут указывать на один и тот же элемент (если список зациклен)

начальная нециклическая часть может привести к тому, что первый период будет пропущен, но рано или поздно оба итератора войдут в циклическую часть, а после этого сравняются на первом же шаге с номером кратным периоду


--------------------
qqq
PM WWW   Вверх
Fardon
  Дата 7.12.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.12.2009

Репутация: нет
Всего: нет



Цитата(maxim1000 @ 7.12.2009,  09:17)
делаем два итератора по списку
в цикле один сдвигаем на один элемент, второй - на два
работаем, пока не дойдём до конца или не обнаружим, что оба итератора указывают на один и тот же элемент

расстояние между ними на каждом шаге увеличивается на 1, так что, когда номер шага кратен периоду, итераторы будут указывать на один и тот же элемент (если список зациклен)

начальная нециклическая часть может привести к тому, что первый период будет пропущен, но рано или поздно оба итератора войдут в циклическую часть, а после этого сравняются на первом же шаге с номером кратным периоду

Спасибо! smile Как раз то, что нужно. 
немного не додумал) теперь кажется так легко smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.