PHP Code:
/*
lista non ordinata- vai i array - fai qsort ordinando vettore,
relinca elementi vettore e restituisci il vettore come se fosse una lista ordinata
*/
/***
* _ _
* (_) (_)
* __ ____ _ _ _____ ___ ___ ___ ___ _ __ ___
* \ \/ / _` | |/ _ \ \ / / |/ _ \ / __/ _ \| '_ ` _ \
* > < (_| | | (_) \ V /| | (_) | (_| (_) | | | | | |
* /_/\_\__, |_|\___/ \_/ |_|\___(_)___\___/|_| |_| |_|
* __/ |
* |___/
*/
#include <st***.h>
#include <stdlib.h>
#include <string.h>
typedef struct element {
char * info;
int points;
struct element * link;
} element_struct;
/////////////////////////// prototypes
void * xmalloc (int byte);
element_struct * save_list ( element_struct * lista, int * elements_to_save);
void relink ( element_struct * vet_to_save , int elements_to_save);
int compara_elementi ( const void *a, const void *b);
/////////////////////////////////////////////// begin
int main ( void ) {
//// sample data
element_struct data[]={
{"spada", 100, data + 1},
{"scudi", 230, data + 2},
{"maronna", 450, data + 3},
{"prezzemolo", 10, NULL}
};
////////////// end sample data
////////////////////////// declaration
element_struct * lista; // input list
element_struct * vet_to_save; // vet returned from function - save this to disk
int elements_to_save; // number of elements to save
int i; // used to count
////////////////////////////// end declaration
////////////// sample data to list - replace here the source
lista = data;
///////////////////////////////////// save list to array
vet_to_save = save_list ( lista, &elements_to_save);
////////////////////// at this point the vet_to_save is ready to be saved to disk, it contains elements_to_save objects
////////////////////////////////// order array
qsort (vet_to_save, elements_to_save , sizeof(element_struct), compara_elementi);
////////////////////// at this point the vet_to_save is ready to be saved to disk, it contains elements_to_save objects ordered by info
//////////////////////////////////// relink array to create a new list ordered
relink ( vet_to_save, elements_to_save);
lista = vet_to_save;
///////////////////////////////// print saved array - debug only
for (i=0 ; i<elements_to_save; i++){
printf("%s , %d \n", (vet_to_save + i)-> info , (vet_to_save + i)-> points );
}
return 0;
}
/////////////////////////////////////////////////////////////////// functions
void relink ( element_struct * vet_to_save , int elements_to_save){
int i;
for (i=0;i< elements_to_save-1;i++){
(vet_to_save +i ) -> link = (vet_to_save + i + 1);
}
(vet_to_save +i ) -> link = NULL;
}
int compara_elementi ( const void *a, const void *b) {
element_struct * ele1;
element_struct * ele2;
ele1 = (element_struct *) a;
ele2 = (element_struct *) b;
return strcasecmp ( ele1->info , ele2->info);
}
element_struct * save_list ( element_struct * lista, int * elements_to_save){
element_struct * temp_node;
element_struct * vet_to_save;
int i;
//////////////////////////////// conto il numero di elementi
for ( temp_node = lista , i=0 ; temp_node != NULL; i++ , temp_node = temp_node ->link){
}
/////////////////////////////// salvo numero di elementi
*elements_to_save = i;
///////////////////////////////// alloco spazio per il blocco consecutivo di dati
vet_to_save = (element_struct *) xmalloc ( i * sizeof(element_struct));
for ( temp_node = lista , i = 0 ; temp_node != NULL; i++ , temp_node = temp_node ->link){
memcpy (vet_to_save + i, temp_node , sizeof(element_struct));
}
return vet_to_save;
}
////////////////////////////////////////////////////////// xmalloc = malloc + error control
void * xmalloc (int byte){
void * punt;
punt = malloc (byte);
if (punt == NULL){
printf("Spazio non sufficiente\n");
exit(-1);
}
return punt;
}