#include <iostream>
using namespace std;
class Element{
private:
int medals;
string name;
Element* previous;
Element* next;
public:
Element(int medals, string name){
this->medals = medals;
this->name = name;
this->previous = NULL;
this->next =NULL;
}
void setMedals(int medals){
this->medals = medals;
}
int getMedals(){
return this->medals;
}
void setName(string name){
this->name = name;
}
string getName(){
return this->name;
}
void setPrevious(Element* previous){
this->previous = previous;
}
Element* getPrevious(){
return this->previous;
}
void setNext(Element* next){
this->next = next;
}
Element* getNext(){
return this->next;
}
};
class DoubleLinkedList{
private:
Element* first;
Element* last;
public:
DoubleLinkedList(){
this->first = NULL;
this->last = NULL;
}
void add(Element* e){
if(this->first == NULL){
this->first = e;
this->last = this->first;
return;
}
this->last->setNext(e);
e->setPrevious(this->last);
this->last = e;
}
void sortDesc(){
if(this->first == NULL){
cout << "List empty" << endl;
return;
}else if(this->first->getNext() == NULL){
cout << "There is just one element in the list" << endl;
return;
}
Element* temp = this->first;
int aux = -1;
while(temp != NULL){
if(temp->getNext() != NULL && (temp->getMedals() < temp->getNext()->getMedals()) ){
this->swapNext(temp);
continue;
}
temp = temp->getNext();
}
}
void swapNext(Element* e){
if(e == NULL){
cout << "Null parameter!" << endl;
return;
}else if(e->getNext() == NULL){
cout << "The next element to the parameter is null!" << endl;
return;
}
if(e == this->first){
this->first = e->getNext();
//TODO: Hay un error Swaping los elementos cuando el elemento no es el primero
Element* temp = e->getNext();
if(e->getNext()->getNext() != NULL) e->getNext()->getNext()->setPrevious(e);
e->setNext(e->getNext()->getNext());
e->setPrevious(temp);
temp->setPrevious(e->getPrevious());
temp->setNext(e);
}else{
if(e->getNext() == this->last){
this->last = e;
}
Element* temp = e->getNext()->getNext();;
if(temp != NULL){
temp->setPrevious(e);
}
e->getPrevious()->setNext(e->getNext());
e->getNext()->setPrevios(e->getPrevious());
e->setPrevious(e->getNext());
e->getPrevious()->setNext(e);
e->getNext(temp);
}
}
void printElements(){
if(this->first == NULL){
cout << "List empty." << endl;
return;
}
Element* temp = this->first;
while(temp != NULL){
cout << temp->getName() << " : " << temp->getMedals() << endl;
temp = temp->getNext();
}
}
};
int main(){
Element* e1 = new Element(1,"Dawlin");
Element* e2 = new Element(3,"Juan");
Element* e3 = new Element(2,"Samuel");
DoubleLinkedList* list = new DoubleLinkedList();
list->add(e1);
list->add(e2);
list->add(e3);
list->printElements();
list->sortDesc();
list->printElements();
delete list;
return 0;
}