Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двусвязный список. Как определить закольцованность? 
:(
    Опции темы
andrew_121
Дата 12.4.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Всем доброго времени сУток!
Вопрос в следующем.
Есть двусвязный список:
Код

struct Node {
...
   Node* prev;
   Node* next;
};

Как(в теории) определить, закольцован он или нет?
Рекурсия не подходит. Сами понимаете почему.
В общем...любопытно Ваше мнение.

Спасибо за внимание.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 12.4.2009, 18:45 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

struct List {
  Node* first;
  Node *last;
};
if (first == last) закольцован




--------------------
PM MAIL   Вверх
mes
Дата 12.4.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(andrew_121 @  12.4.2009,  17:28 Найти цитируемый пост)
Как(в теории) определить, закольцован он или нет?

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


Это сообщение отредактировал(а) mes - 12.4.2009, 21:33


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 12.4.2009, 21:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



100% результат - это создание массива указателей, в который помещать каждый узел и пробежаться по списку. Если такой адрес в массиве есть - значит закольцованность.
Менее надежно - ввести в узлы служебное поле, которому присваивать определенное значение. Дошли до узла с таким значением - закольцован. Менее надежен потому, что случайно такое значение может быть. Для чистоты эксперимента прогнать второй раз с другим значением.
PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Anikmar @  12.4.2009,  21:31 Найти цитируемый пост)
Для чистоты эксперимента прогнать второй раз с другим значением. 

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

ЗЫЖ к стенке надо таких прграммистов

Добавлено через 2 минуты и 9 секунд
2mes, 

а я там давал вторую часть задачи? починить список?


--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(J0ker @  13.4.2009,  00:17 Найти цитируемый пост)
для еще большей чистоты - прогнать третий раз

Третий не нужно - для проверки 2-х раз достаточно  smile 

Цитата(J0ker @  13.4.2009,  00:17 Найти цитируемый пост)
ЗЫЖ к стенке надо таких прграммистов

За что меня к стенке?  smile  Я всего-лишь предложил 2 варианта - первый мне больше нравится.  smile  Вашего варианта я же не видел - может он лучше, я бы свои не предлагал.

Злые вы.  smile 
PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Anikmar @  13.4.2009,  07:30 Найти цитируемый пост)
Третий не нужно - для проверки 2-х раз достаточно

т.е. второй раз "случайно такое значение"(С)Anikmar быть не может? это закон природы такой, да?  smile 

Цитата(Anikmar @  13.4.2009,  07:30 Найти цитируемый пост)
Вашего варианта я же не видел - может он лучше, я бы свои не предлагал.

вы видели вариант mes'а, но видимо не прониклись

Добавлено через 47 секунд
Цитата(Anikmar @  13.4.2009,  07:30 Найти цитируемый пост)
Злые вы

мы не злые, мы мудрые


--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(J0ker @  13.4.2009,  09:11 Найти цитируемый пост)
вы видели вариант mes'а, но видимо не прониклись

А если конец списка ссылается на начало? Быстрый итератор будет равен первому элементу, а медленный в середине где-то? Разве равенство сработает?

Цитата(J0ker @  13.4.2009,  09:11 Найти цитируемый пост)
т.е. второй раз "случайно такое значение"(С)Anikmar быть не может? это закон природы такой, да?   

Второй раз случайно может быть, но это обнаружимо. В любом случае, я вижу только мой первый вариант как 100% 

Все проникся - все равно догонит.

Цитата(J0ker @  13.4.2009,  09:11 Найти цитируемый пост)
мы не злые, мы мудрые 

Мудрые к стенке не ставят. Мудрые доводят до самоубийства.  smile  

Это сообщение отредактировал(а) Anikmar - 13.4.2009, 09:45
PM MAIL ICQ   Вверх
mes
Дата 13.4.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  13.4.2009,  06:30 Найти цитируемый пост)
Вашего варианта я же не видел - может он лучше, я бы свои не предлагал.

Предложенный мной вариант, был услышан некоторое время назад от Joker.  
smile 

Цитата(J0ker @  12.4.2009,  23:17 Найти цитируемый пост)
а я там давал вторую часть задачи? починить список? 

припоминаю.. для односвязанного списка. 
Видится примерно такая картина:
от места встречи проходим по круг у и узнаем длину петли. 
и на основании длины петли, кол-во шагов быстрого итератора, и шагов медленного можно посчитать место пересечения.

Так для случая отн. большой петли (если быстрый до места встречи успел пройти по петле только раз) 
L=2*O-S , 
где L - длина от начала , до конца (до стыка который надо востанавливать)
      О-длина петли
      S-кол-во шагов медленного.

Для остальной части задачи надо мозги напрячь.. попозже попробую.. 
 smile 


--------------------
PM MAIL WWW   Вверх
jonie
Дата 13.4.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



имхо покрасить каждый элемент при простом проходе, если попали на покрашенное - значит кольцо есть.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mes
Дата 13.4.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(jonie @  13.4.2009,  10:40 Найти цитируемый пост)
имхо покрасить каждый элемент при простом проходе, если попали на покрашенное - значит кольцо есть. 

 если только список предполагал возможность окрашивания +  надо как то убедиться что список нигде не подкрашен.
 smile 



--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 13.4.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(jonie @  13.4.2009,  11:40 Найти цитируемый пост)
имхо покрасить каждый элемент при простом проходе, если попали на покрашенное - значит кольцо есть.

Да. Этот вариант мне больше нравится.

Цитата(mes @  13.4.2009,  11:56 Найти цитируемый пост)
надо как то убедиться что список нигде не подкрашен.
 smile 

И вернулись к изначальному вопросу smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jonie
Дата 13.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



и в чем проблема создать map<void*, isColored> подобную структуру при обходе? не вижу никаких проблем.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrew_121
Дата 13.4.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



jonie, Да. Спасибо. Вопрос решен.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 13.4.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(jonie @  13.4.2009,  12:17 Найти цитируемый пост)
и в чем проблема создать map<void*, isColored> подобную структуру при обходе? не вижу никаких проблем. 

а как узнать длину списка если он закольцован ?
a если проверять есть ли в списке уже указатель, то зачем параметр isColored ?


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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