Sortowanie listy przez łączenie naturalne
Mariusz:
Chciałbym wykorzystać pomysł łączenia naturalnego do sortowania listy
Sortowanie można by podzielić na trzy procedury
Procedura rozdzielająca serie na przemian do dwóch list
Procedura scalająca serie występujące w dwóch listach
Procedura sortująca
(Nie tworzymy nowych węzłów tylko ustawiamy dowiązania istniejących węzłów)
Do wykrywania końca serii przeglądać listę dwoma wskaźnikami
(porównywanie klucza w poprzednim węźle oraz w bieżącym węźle)
czy wystarczy jeden wskaźnik
(porównywanie klucza w bieżącym węźle i w następnym węźle)
Wygląda na to że procedura scalająca będzie nieco bardziej skomplikowana
niż w algorytmie rekurencyjnym bo tutaj musimy uwzględnić także scalanie serii
Ciekaw jestem waszych pomysłów na zrealizowanie tych funkcji
16 paź 21:42
Mariusz:
template<class T>
class Node
{
T data;
Node *next;
public:
Node(T data)
{
this−>data = data;
this−>next = NULL;
}
T getData();
void setData(T data);
Node *getNext();
void setNext(Node *p);
};
template<class T>
T Node<T>::getData()
{
return this−>data;
}
template<class T>
void Node<T>::setData(T data)
{
this−>data = data;
}
template<class T>
Node<T> *Node<T>::getNext()
{
return this−>next;
}
template<class T>
void Node<T>::setNext(Node *p)
{
this−>next=p;
}
template<class T>
class List
{
Node<T> *head;
public:
List()
{
this−>head=NULL;
}
void push(T data);
void pop();
Node<T> *searchNode(T data);
void insertNode(T data);
void deleteNode(T data);
void printList();
};
template<class T>
void List<T>:: push(T data)
{
Node<T> *x=new Node<T>(data);
x−>setNext(this−>head);
this−>head=x;
}
template<class T>
void List<T>:: pop()
{
Node<T> *p;
if(this−>head!=NULL)
{
p=this−>head;
this−>head=this−>head−>getNext();
delete p;
}
}
template<class T>
Node<T> *List<T>::searchNode(T data)
{
Node<T> *x;
x=this−>head;
while(x!=NULL && x−>getData()!=data)
x=x−>getNext();
return x;
}
template<class T>
void List<T>::insertNode(T data)
{
Node<T> *x=new Node<T>(data);
Node<T> *y;
Node<T> *z;
if(this−>head==NULL)
{
this−>head=x;
x−>setNext(NULL);
}
else
{
y=this−>head;
z=NULL;
while(y!=NULL && x−>getData()>y−>getData())
{
z=y;
y=y−>getNext();
}
x−>setNext(y);
if(z!=NULL)
{
z−>setNext(x);
}
else
{
this−>head=x;
}
}
}
template<class T>
void List<T>:: deleteNode(T data)
{
Node<T> *x;
Node<T> *y;
x=this−>searchNode(data);
if(this−>head!=NULL && x!=NULL)
{
if(this−>head==x)
{
this−>head=x;
this−>head=x−>getNext();
delete x;
}
else
{
y=this−>head;
while(y−>getNext()!=x)
{
y=y−>getNext();
}
y−>setNext(x−>getNext());
delete x;
}
}
}
template<class T>
void List<T>:: printList()
{
Node<T> *p=this−>head;
while(p!=NULL)
{
cout<<p−>getData()<<" −> ";
p=p−>getNext();
}
cout<<"NULL"<<endl;
}
Ostatnio bawiłem się Pythonem (na Linuksie z płytki tylko Python i C/C++ są dostępne)
i postanowiłem podobną klasę napisać w C++
Jak dopisać łączenie naturalne do tej listy
21 paź 09:09
sata: Idz już stąd nudny jesteś.
21 paź 21:20