Funkcja swap dla listy dwukierunkowej

Funkcja swap dla listy dwukierunkowej
JA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:178
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:

Kopiuj
 
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:

Kopiuj
#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");
}
 
DR
  • Rejestracja:około 12 lat
  • Ostatnio:około 14 godzin
  • Postów:1131
0

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

_13th_Dragon
@Dregorio, czy cokolwiek o tej istniejącej swap wiesz oprócz tego że na poczekanie znalazłeś w google?
DR
Nie, tylko to :)
DR
Ale przecie swap oczekuje adresów, więc sobie wykoncypowałem to :P
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:17 dni
0

Jak przedstawisz listę rozsądnie:

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

to funkcje:

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

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.