#include "liste.h"
/*Crea e alloca un nodo con informazione info e link che punta a NULL.
Ritorna il puntatore al nuovo nodo.*/
tNode* nodeCreate( tInfo info ){
tNode *newNode;
newNode = ( tNode* ) malloc( sizeof( tInfo ) );
if( newNode == NULL )
return NULL;
newNode->info = info;
newNode->link = NULL;
return newNode;
}
/*Dealloca il nodo passato come parametro*/
void nodeDestroy( tNode* node ){
free( node );
}
/*Crea una lista vuota.
Ritorna il riferimento a tale lista.*/
tList listCreate(){
return NULL;
}
/*Dealloca una lista cancellando ogni elemento contenuto in essa.
Restituisce il riferimento alla lista.*/
tList listDestroy( tList lista ){
tNode *current, *next;
next = NULL;
current = lista;
while( current != NULL ){
next = current->link;
nodeDestroy( current );
current = next;
}
return NULL;
}
void printInfo( tInfo info ){
printf( "\n\t%d\n", info );
}
/*Stampa ogni elemento di una lista*/
void listPrint( tList lista ){
tNode *current;
current = lista;
while( current != NULL ){
printInfo( current->info );
current = current->link;
}
}
/*Restituisce TRUE se la lista è vuota e non presenta elementi, FALSE se esistono elementi*/
bool isEmpty( tList lista ){
if( lista == NULL )
return true;
else
return false;
}
/*Stabilisce quale tra info1 e info2 è maggiore.
Restituisce TRUE se info1 è più grande di info2, FALSE in caso contrario*/
bool greater( tInfo info1, tInfo info2 ){
if( info1 > info2 )
return true;
else
return false;
}
/*Stabilisce se info1 e info2 sono uguali.
Restituisce TRUE se info1 è uguale ad info2, FALSE in caso contrario*/
bool equal( tInfo info1, tInfo info2 ){
if( info1 == info2 )
return true;
else
return false;
}
/*Inserisce all'interno di una lista un nodo contenente l'informazione info mantenendo l'ordinamento.
Restituisce il riferimento alla lista.*/
tList listInsert( tList lista, tInfo info ){
tNode *newNode, *previous, *current;
current = lista;
previous = NULL;
while( current != NULL && greater( info, current->info ) ){
previous = current;
current = current->link;
}
newNode = nodeCreate( info );
if( newNode == NULL )
return lista;
if( previous == NULL ){
newNode->link = current;
return newNode;
}
previous->link = newNode;
newNode->link = current;
return lista;
}
/*Cancella un elemento dalla lista mantenendo l'ordinamento.
Restituisce il riferimento alla lista.*/
tList listDelete( tList lista, tInfo info ){
tNode *current, *previous;
current = lista;
previous = NULL;
if( current == NULL )
return lista;
while( current != NULL && greater( info, current->info ) ){
previous = current;
current = current->link;
}
if( equal( info, current->info ) ){
previous->link = current->link;
nodeDestroy( current );
return lista;
}
}
/*Ricerca un elemento tInfo all'interno di una lista.
Restituisce il riferimento all'elemento trovato*/
tNode* listSearch( tList lista, tInfo info ){
tNode *current;
current = lista;
if( current == NULL )
return NULL;
while( current != NULL && greater( info, current->info ) )
current = current->link;
if( equal( info, current->info ) )
return current;
else
return NULL;
}