Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++, Двусвязный список, ф-ция swap

14K
23 декабря 2007 года
demonoide
30 / / 11.02.2007
Ну не получается, хоть убей её написать для двунаправленного (двусвязного) списка. Список свой:

вот так выглядит список.

Код:
class DList
{
private:
    int n;
    Member * begin;
    Member * end;
    Member * position;

public:
    void Swap(int,int);
//.....
}


Класс Member:
Код:
class Member              
{
    char *sHeader,
           *sText,
           **sTags;
   
    int nHeaderLen,
        nTextLen,
        numTags; //количество тегов
       
public:
    Member *next,*prev;
//....
}


Вот как я думал написать эту ф-цию, но она не работает.

Код:
void DList::Swap(int index1, int index2)
{
    int i;
    Member* position1=begin;
    Member* position2=begin;
    Member* temp;

    for(i=0; i<index1 && position1 && position1->next; i++)
    position1=position1->next;
   
    for(i=0; i<index2 && position2 && position2->next; i++)
    position2=position2->next; 
   
    if(index1 && index2 && index1!=n && index2!=n)
    {

    if(position1->prev && position1->prev)
    {
    temp=position1->prev->next;
    position1->prev->next=position2->prev->next;
    position2->prev->next=temp;
    }

    if(position1->next && position2->next)
    {
    temp=position1->next->prev;
    position1->next->prev=position2->next->prev;
    position2->next->prev=temp;
    }
       
    temp=position1->next;
    position1->next=position2->next;
    position2->next=temp;

    temp=position1->prev;
    position1->prev=position2->prev;
    position2->prev=temp;  
    }
}


Просьба поправить, или переписать. Буду очень благодарен.
14K
23 декабря 2007 года
demonoide
30 / / 11.02.2007
*Забыл сказать.

Ф-ция принимает 2 индекса - тех элементов, которые нужно менять, это не тот swap, что реализован в STL ^_^

вот ещё вариант, но тоже нерабочий... ну не получается..ёлы

Код:
void DList::Swap(int index1, int index2)
{
   
    int i;
    Member* position1=begin;
    Member* position2=begin;
    Member* temp;

    //доходим до 1го элемента
    for(i=0; i<index1 && position1 && position1->next; i++)
    position1=position1->next;
   
    //доходим до 2го элемента
    for(i=0; i<index2 && position2 && position2->next; i++)
    position2=position2->next; 
   
    //если они не равны
    if(index1!=index2)
    {
       
        //предыдущий->следующий первого - указывает на второй
        if(position1->prev)
        {
            position1->prev->next=position2;
        }
       
        //предыдущий->следующий второго - указывает на первый
        if(position2->prev)
        {
            position2->prev->next=position1;
        }
       
        //следующий->предыдущий первого - указывает на второй
        if(position1->next)
        {
            position1->next->prev=position2;
        }
       
        //следующий->предыдущий второго - указывает на первый
        if(position2->next)
        {
            position2->next->prev=position1;
        }

        //меняем местами первый->следующий и второй->следующий     
        if(position1 && position2)
        {
            temp=position1->next;
            position1->next=position2->next;
            position2->next=temp;
        }
       
        //меняем местами второй->следующий и первый->следующий     
        if(position1 && position2)
        {
            temp=position1->prev;
            position1->prev=position2->prev;
            position2->prev=temp;
        }
    }
}
14K
30 декабря 2007 года
demonoide
30 / / 11.02.2007
Ребят, ну ёлы палы, ну помогите, уже всё перепробовал - работает, если не учитывать 1й эл-т (менять эл-ты от 2го до последнего), первый затирается.
320
30 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: demonoide
Ребят, ну ёлы палы, ну помогите, уже всё перепробовал - работает, если не учитывать 1й эл-т (менять эл-ты от 2го до последнего), первый затирается.


В FAQ раздела Студентам есть ссылки на темы,где делали списки. Посмотри.Там правда нет функции Swap,но написать ее не трудно.Для того двусвязного списка,что в ссылке что-то такое должно быть.

Код:
...template <typename T>
void List<T>::Swap(int pos1,int pos2)
{
    if(pos1 < 1 || pos1 > Count || pos2 < 1 || pos2 >Count)
    {
      // Неверная позиция
      cout << "Incorrect position !!!\n";
      return;
    }
    Elem<T> * temp = new Elem<T>;
    temp->data = this->GetElem(pos1)->data;
    this->GetElem(pos1)->data = this->GetElem(pos2)->data;
    this->GetElem(pos2)->data = temp->data;
    delete temp;
}...

P.S. Новый Год приближается...Ребята еще с пятницы начали культурно отдыхать ( ты ж читаешь другие разделы ? Общалку .;) ) Так что тут удивляться ,что никто не отвечает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог