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!!!