Sono andato a vedere l'esame di programmazione ed è uscita la seguente traccia:

Testo della prova
Implementare in linguaggio C++ un tipo di dato astratto Lista allocato dinamicamente. Ogni elemento della lista dovrà contenere le seguenti informazioni:
- Nome, di tipo string; (si può utilizzare la classe string fornita dalle librerie)
- Età, di tipo int, che indica l'età del soggetto.

Sulla lista dovranno essere realizzati i seguenti metodi (oltre ovviamente a costruttore e distruttore):
Empty() Verifica se la lista è vuota.
Initialize(const string valore[], const int eta[], int dim ) Inserisce inizialmente i valori presenti nell'array dei nomi con le rispettive età indicate nell'array eta.
Elimina(const string valore) Elimina l'elemento valore dalla lista.
Stampa() Visualizza a video gli elementi contenuti nella lista, con l'età.

In aggiunta si implementino le seguenti funzioni:

Insert(const string val) Inserisce in coda un nuovo valore nella lista, se il valore non è presente.
Ordina( ) Ordina la lista in funzione dell'età;



Ho saputo implementare tutte le funzioni tranne quella Ordina(), qualcuno può aiutarmi???

Il mio file di specifica lista.h è :
codice:
using namespace std;

struct nodo;
typedef nodo* N;
struct nodo{
       int eta;
       string nome;
       N next;
       };
       
class lista{
      N testa;
      public:
             lista():testa(0){}
             bool empty();
             void initialize(const string valore[],const int eta[],int dim);
             void elimina(const string valore,const int eta);
             void stampa();
             void insert(const string val,const int eta);
             void ordina();
             ~lista();
             };
void n2();
Vi metto per completezza anche il file di implementazione e il main...anche se nn penso servano a molto per il mio problema:


lista.cpp
codice:
#include <iostream>
#include "lista.h"
#include <string>


using namespace std;
void n2(){
     cout<<"\n\n";
     }
bool lista::empty(){
     return (testa==0);
     }
lista::~lista(){
              for(N q=testa;q!=0;testa=q){
                    q=testa->next;
                    delete testa;
                    }
                    }
void lista::initialize(const string valore[],const int eta[],int dim){
     for(int i=0;i<dim;i++){
             N q=new nodo;
             q->nome=valore[i];
             q->eta=eta[i];
             q->next=testa;
             testa=q;
             }
             }
void lista::stampa(){
     cout<<"Stampa....\n\n";
     for(N temp=testa;temp!=0;temp=temp->next){
                                               cout<<"\nNome: "<<temp->nome;
                                               cout<<"\nEta': "<<temp->eta;
                                               }
     cout<<"\n\n";
                  }//Chiude la stampa
//Inserisce in coda un nuovo valore nella lista, se il valore non è presente                  
void lista::insert(const string val,const int eta){
     N t=testa;
     bool trovato=false;
     while(t!=0 && !trovato){
                if(((t->nome==val)) && (t->eta==eta))trovato=true;
                else t=t->next;
                            }
     if(!trovato){
                  N q=new nodo;
                  q->nome=val;
                  q->eta=eta;
                  q->next=0;
                  N temp=testa;
                  //Devo far puntare l'ex ultimo elemento al nuovo elemento inserito che sarà l'ultimo
                  while(temp->next!=0)temp=temp->next;
                  temp->next=q;
                  }
     else cout<<"\n\nElemento da inserire gia' esistente:";
                                                    }//Chiude l'insert
void lista::elimina(const string val,const int eta){
     bool trovato=false;
     N temp=testa;
     N prec;
     while((temp!=0) && (!trovato)){
                     if((temp->nome==val)&&(temp->eta==eta))trovato=true;
                     else{
                           prec=temp;
                           temp=temp->next;
                           }//chiude l'else
                     }
     if(trovato){
                 if(temp==testa){//Se l'elemento da eliminare sta in testa basta mettere in testa quello a cui
                                 //l'ex elemento di testa(quello da eliminare) puntava!
                                 testa=testa->next;
                                 delete temp;
                                 }
                 else if(temp==0){//Se l'elemento da eliminare sta in coda basta far puntare il penultimo elemento a
                                  //0 e eliminare l'elemento di coda
                                  prec->next=0;
                                  delete temp;
                                  }
                 else{//Se l'elemento da eliminare non sta nè in coda nè in testa procedo in questo modo
                      N l=temp;
                      temp=temp->next;
                      prec->next=temp;
                      delete l;
                      }
                 }//Chiude l'if(trovato)
      else cout<<"Elemento da eliminare non trovato!!";
      n2();
      }//Chiude la funzione elimina

void Ordina(){.....
................??????..........
}
mainlista.cpp(file utente):

codice:
#include <iostream>
#include <string>
#include "lista.h"
#include <windows.h>
using namespace std;

int main(){
    lista l;
    int dim;
    dim=3;
    string nomi[dim];
    int et[dim];
    nomi[0]="Mario";
    et[0]=20;
    nomi[1]="Giuseppe";
    et[1]=35;
    nomi[2]="Fabrizio";
    et[2]=40;
    l.initialize(nomi,et,dim);
    cout<<"La lista inserita e': \n\n";
    l.stampa();
    l.insert("Mario",10);
    n2();
    l.stampa();
    
    l.elimina("Fabrizio",40);
    cout<<"Elimino Fabrizio, 40...";
    n2();
    Sleep(2222);
    l.stampa();
    system("PAUSE");
    return 0;
}
p.s.Mi dite anche se ho implementato bene la funzione distruttore???


Grazie in anticipo per le risposte!!!