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 listaint 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"100data 1},
        {
"scudi"230data 2},
        {
"maronna"450data 3},
        {
"prezzemolo"10NULL}
        
     };
    
//////////////  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_saveelements_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_saveelements_to_save);
    
lista vet_to_save;
    
    
///////////////////////////////// print saved array - debug only
    
    
for (i=i<elements_to_savei++){
        
        
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;ielements_to_save-1;i++){
        
        (
vet_to_save +) -> link = (vet_to_save 1);
        
    }
    (
vet_to_save +) -> 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 listaint elements_to_save){
    
    
element_struct temp_node;
    
element_struct vet_to_save;
    
int i;
    
    
//////////////////////////////// conto il numero di elementi
    
    
for ( temp_node lista i=temp_node != NULLi++ , 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 sizeof(element_struct));
    
    
    for ( 
temp_node lista temp_node != NULLi++ , temp_node temp_node ->link){
        
        
memcpy (vet_to_save itemp_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;