Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Задача на двухсторонний список


Автор: Goryachev 30.3.2005, 23:56
Задача:
Сделать двухсторонний список, пользуясь одним указателем в структуре, и двумя внешними указателями на список.

Обсудите.
Ответ приведу позже.

Автор: cardinal 31.3.2005, 01:34
В голову пришло следующее...

Автор: Олег М 31.3.2005, 07:49
Цитата(cardinal @ 31.3.2005, 02:34)
В голову пришло следующее...

smile Ну да, p1,p2 - указывают на текущю позицию, элементы указывают разные стороны - p1->item - в сторону головы, p2->item в сторону хвоста. При смене текущей позиции нужно менять указатели соответствующим образом

Автор: cardinal 31.3.2005, 13:44
Цитата
p1->item - в сторону головы, p2->item в сторону хвоста

Я бы только сказал,
p1->item - в сторону текущего элемента, а p2->item в сторону его предыдущего элемента...
Уж больно трудно в таком списке сказать где голова, а где хвост... smile

Автор: maxim1000 31.3.2005, 14:28
smile а я не понял задачи smile
что такое двусторонний список?

Автор: _hunter 31.3.2005, 14:38
список, двжение по элементам которого возможно и вперед и назад

Автор: maxim1000 31.3.2005, 14:44
тогда не надо даже двух внешних указателей (достаточно одного)...
просто делаем кольцевой список, движение вперед - как обычно, движение назад - двигаемся вперед, пока не найдем элемент, который указывает на исходный smile

Автор: _hunter 31.3.2005, 15:20
а если элементов много? слишком долго ходить придется...

Автор: maxim1000 31.3.2005, 16:25
Цитата
а если элементов много? слишком долго ходить придется...

а о времени речь не шла smile
Цитата
которого возможно и вперед и назад


Автор: Олег М 31.3.2005, 16:44
Цитата(maxim1000 @ 31.3.2005, 17:25)
а о времени речь не шла

smile А о чём тогда вообще речь шла? Как раз об этом!

Автор: Goryachev 1.4.2005, 09:24
cardinal
Очень круто все сделанно, но у тебя список изменяется динамически, итого: чтоб завершить работу с таким списком (если параметры by value), то надо будет возвращаться до начала обратно, чтоб плменять поинтеры на их начально правильное положение.
Теперь подумайте, как это сделать, не изменяя динамически поинтеры.
smile

Автор: cardinal 1.4.2005, 15:04
Цитата(Goryachev @ 1.4.2005, 07:24)
чтоб завершить работу с таким списком (если параметры by value), то надо будет возвращаться до начала обратно

Это чтобы delete сделать чтоли? smile

А я его так сделаю:
См. шаг три. Я рекурсивно спущусь по p1 и p2 функцией, которая будеть выглядеть примерно так

функция (получает поинтер x)
{
if pointer(элемента) <> NULL ,то
функция(pointer(элемента));
else
delete x;
}

Цитата(Goryachev @ 1.4.2005, 07:24)
Теперь подумайте, как это сделать, не изменяя динамически поинтеры.

Может позже... smile

Автор: yaja 4.4.2005, 17:42
Не понял (((
По определению двунаправленный список, ето такая хрень, в которой для любого элемента можно получить предыдущий и следующий. Однако, при предложенных требованиях, очевидно, ето сделать нельзя. Т.ч уточните, что должен делать етот "список" )))

Автор: Goryachev 4.4.2005, 22:19
Цитата(yaja @ 4.4.2005, 17:42)
По определению двунаправленный список, ето такая хрень, в которой для любого элемента можно получить предыдущий и следующий.

Не совсем. Если ты киваешь на определенный элемент, то можешь получить предыдущий и следующий.
Решение дам в субботу. Еще есть время подумать...

Автор: yaja 8.4.2005, 17:15
Что-то мне в голову такой изврат пришел в голову... smile smile smile smile
Будем хранить не указатель в каждом элементе, а xor указателей на предыдущий и на следущий, а внешние указатели будут хранить текущий элемент(p1) и элемент(p2) из которого мы пришли в p1. Тогда указатели на следущий и предыдущий элемент - p2 и (p1->xoredPointer) ^ p2 в зависимость откуда мы пришли в p1.
Вроде должно работать smile smile smile smile

Автор: Goryachev 10.4.2005, 23:40
yaja
Зверь, это то решение, которое я хотел дать. Все, решили. smile


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)