Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С++] Кольцевой двусвязный список.


Автор: Nordom 4.5.2005, 18:28
Други...
Имею прогу, реализующую работу с двусвязным линейным списком...
Помогите превратить в прогу делающую то же самое с двусвязным кольцевым списком, то есть заменить линейный на кольцевой...
Это C++...

А то я всю голову сломал уже, лекции препод какие-то странные надиктовал.. smile smile

Автор: gepard 5.5.2005, 04:35
Я так понимаю, что линейный список - это несвязанный?
ну тогда всё просто!
Указатель первого элемента на предыдущий ставить на последний элемент и указатель последнего на следующий на первый. Вот тебе и связанный!

Автор: Nordom 5.5.2005, 12:18
gepard
smile
smile
Желательно бы на код поглядеть, а то теорию я и так знал, а как это в код преобразовывается- хз... smile

Автор: kometa_triatlon 18.5.2005, 03:44
Скажи, что конкретно нужно делать, а то програ реализующая работу - понятие растяжимое.

Автор: gepard 18.5.2005, 06:41
Код


AObjects::AObjects()//Конструктор класса
{
    next = 0;
    prev = 0;
}

void AObjects::Destroy()//Уничтожить ВСЕ объекты
{
    surface.Destroy();
    if (prev)
    {
        prev->next = next;
        if (next)
            next->prev = prev;
    }
    else
        if (next)
            next->prev = 0;
    delete this;
}

void AObjects::addNewObject()//Добавить новый объект в конец списка
{
    AObjects *tmp = getLastObject();
    if (!tmp)
    {
        sys.Log("Can't Apply New Object To NULL Object\n");
        return;
    }

    tmp -> next = new AObjects;
    tmp -> next -> prev = tmp;
}

AObjects* AObjects::getLastObject()//Вернуть ссылку на последний объект
{
    AObjects *tmp = this;
    if (!tmp)
    {
        sys.Log("Can't Get Next Object From NULL Object");
        return 0;
    }
    while(tmp -> next) tmp = tmp -> next;
    return tmp;
}

void AObjects::destroyNext()//Уничтожить все объекты начиная с данного
{
    surface.Destroy();
    if (prev) prev -> next = 0;
    if (next) next -> destroyNext();
    delete this;
}

Вот так можно реализовать кольцевой с этим кодом:
Код

...//Какой-то код программы
AObjects* obj = new AObjects;
obj->addNewObject();//Добавляем объект
obj->addNewObject();//Добавляем объект
obj->addNewObject();//Добавляем объект
obj->addNewObject();//Добавляем объект
obj->prev = obj->getLastObject();//Указатель первого элемента списка на послдений указывает /на последний объект.
obj->getLastObject()->next = obj;//Указатель последнего объекта на следующий указывает на первый объект списка.
...//Какой-то код программы

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