Witam !
Własnie napisałem funkcje swap dla listy dwukierunkowej, ale żeby wprowadzić wszystkie zabezpieczenia musiałem ją mocno rozbudować i prezentuje się tak:
void swap(node *temp, node* pom,node *&head)
{
if(pom==head || temp->next != NULL) //jesli temp wskazuje na ostatni lub pom wskazuje na pierwszy
{
node *temp2=temp;
temp=pom;
pom=temp2;
}
node * wsk=new node;
wsk->next = temp->next;
wsk->back = temp->back;
temp->next = pom->next;
temp->back = pom->back;
temp->back->next = temp;
if(pom->next != NULL) //jesli pom wskazuje na ostatni elelment
{
temp->next->back = temp;
}
pom->next = wsk->next;
pom->back = wsk->back;
if(temp==head) //jesli temp wskazuje na pierwszy element
{
head=pom;
}
else
{
pom->back->next = pom;
}
pom->next->back = pom;
delete wsk;
}
Zastanawiam się czy da się to jakoś prosto skrócić czy nie bardzo?
Oto cały program:
#include <iostream>
using namespace std;
struct node
{
int value;
node* next;
node *back;
};
void add_start(node *&head, int x)
{
node *temp = new node;
temp->value=x;
temp->next=head;
head->back=temp;
temp->back=NULL;
head=temp;
}
void show_list(node *head)
{
node *temp=head;
while(temp)
{
cout<<temp->value<<"\t";
temp=temp->next;
}
cout<<endl<<endl;
}
void swap(node *temp, node* pom,node *&head)
{
if(pom==head || temp->next != NULL) //jesli temp wskazuje na ostatni lub pom wskazuje na pierwszy
{
node *temp2=temp;
temp=pom;
pom=temp2;
}
node * wsk=new node;
wsk->next = temp->next;
wsk->back = temp->back;
temp->next = pom->next;
temp->back = pom->back;
temp->back->next = temp;
if(pom->next != NULL) //jesli pom wskazuje na ostatni elelment
{
temp->next->back = temp;
}
pom->next = wsk->next;
pom->back = wsk->back;
if(temp==head) //jesli temp wskazuje na pietwszy element
{
head=pom;
}
else
{
pom->back->next = pom;
}
pom->next->back = pom;
delete wsk;
}
int main()
{
node* head=new node;
head->value=5;
head->next=NULL;
head->back=NULL;
add_start(head, 4);
add_start(head, 3);
add_start(head, 2);
add_start(head, 1);
show_list(head);
node * temp=head->next->next->next->next; //2
node *pom=head; //4
swap(temp,pom,head);
show_list(head);
system("PAUSE");
}