class DList
{
private:
int n;
Member * begin;
Member * end;
Member * position;
public:
void Swap(int,int);
//.....
}
С++, Двусвязный список, ф-ция swap
вот так выглядит список.
Код:
Класс Member:
Код:
class Member
{
char *sHeader,
*sText,
**sTags;
int nHeaderLen,
nTextLen,
numTags; //количество тегов
public:
Member *next,*prev;
//....
}
{
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;
}
}
{
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;
}
}
Просьба поправить, или переписать. Буду очень благодарен.
Ф-ция принимает 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;
}
}
}
{
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;
}
}
}
Ребят, ну ёлы палы, ну помогите, уже всё перепробовал - работает, если не учитывать 1й эл-т (менять эл-ты от 2го до последнего), первый затирается.
Цитата: 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;
}...
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. Новый Год приближается...Ребята еще с пятницы начали культурно отдыхать ( ты ж читаешь другие разделы ? Общалку .;) ) Так что тут удивляться ,что никто не отвечает.