Funkcja swap dla listy dwukierunkowej

0

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");
}
 
0

Jesteś świadom że funkcja swap już istnieje? Może ją wykorzystaj?

0

Jak przedstawisz listę rozsądnie:

typedef struct node { int value; node *back,*next; } node;
typedef struct list { node *head,*tail; } list;

to funkcje:

swap(list *lst,node *a,node *b)

da rady zapisać w parę wierszy.
Nie dalej niż parę tygodni temu podawałem tu sortowanie listy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1