corso ASD
Corso di Algoritmi e Strutture Dati a.a. 2014/2015

Esercizio 06

Prendendo come riferimento quanto detto a lezione e il codice della classe Lista realizzare un programma che carichi la lista con 10 persone (tipoelem è una classe Persona avente cognome e punteggio che varia da 0 a 10).
Realizzare una funzione che stampa (cognome e punteggio) le persone presenti nella lista.
Realizzare una funzione che prende in ingresso una lista e restituisce un'altra lista ordinando le persone in ordine alfabetico.
Realizzare una funzione come la precedente con la differenza che l'ordinamento è in base al punteggio in ordine decrescente.
Stampare la lista di persone ordinate in ordine alfabetico e ordinate per punteggio decrescente.
Spedire il codice realizzato entro la mezzanotte di domenica 16 novembre 2014 come file compresso denominato:

esercitazione06-cognome

Inserire nell'oggetto dell'email: [ASD1415] esercitazione06-cognome

Si riporta il codice discusso in aula l'11 novembre 2014.

//  main.cpp

#include 
#include "Lista.h"

int main(int argc, const char * argv[]) {
    Lista studenti;
    tipoelem studente;
    posizione p;
    
    //inserimento dati
    p = studenti.primolista();
    studente="Carrino";
    studenti.inslista(studente, p);
    p = studenti.primolista();
    studente = "Pagliara";
    studenti.inslista(studente, p);
    p = studenti.succlista(p);
    studente = "D'Amico";
    studenti.inslista(studente, p);
    
    //stampa
    cout << "procedo con la stampa degli studenti" << endl;
    studenti.stampalista();
    
    return 0;
}


// lista.h #ifndef LISTA_H #define LISTA_H #include "nodolista.h" typedef class NodoLista * posizione; class Lista { public: void crealista(); bool listavuota(); string leggilista(posizione); void scrivilista(tipoelem, posizione); posizione primolista(); bool finelista(posizione); posizione succlista(posizione); posizione predlista(posizione); void inslista(tipoelem, posizione); void canclista(posizione); void stampalista(); Lista(); ~Lista(); private: posizione testa; }; #endif
// lista.cpp #include "Lista.h" using namespace std; Lista::Lista(){ crealista(); } Lista::~Lista(){} void Lista::crealista(){testa = NULL;} bool Lista::listavuota(){return (testa == 0);} tipoelem Lista::leggilista(posizione p){return p->elemento;}; bool Lista::finelista(posizione p){return (p == 0);} posizione Lista::primolista(){return testa;} posizione Lista::succlista(posizione p){return p->succ;}; posizione Lista::predlista(posizione p){return p->prec;} void Lista::scrivilista(tipoelem a, posizione p) {p->elemento=a;} void Lista::inslista(string a, posizione p){ NodoLista * nuovo = new NodoLista(); nuovo->elemento = a; if (p != NULL){ nuovo->prec = p->prec; nuovo->succ = p; p->prec = nuovo; if(primolista() == p){ testa = nuovo; //p è testa }else{ p->prec->succ = nuovo; } }else{ if(listavuota()){ nuovo->prec = NULL; testa = nuovo; }else{ //trovo ultimo elemento della lista p = primolista(); while ((p->succ != NULL) && !finelista(p)) p = succlista(p); p->succ = nuovo; nuovo->prec = p; } nuovo->succ = NULL; //è ultimo della lista quindi succ è sempre NULL } } //controllare questo metodo void Lista::canclista(posizione p){ if (p != NULL){ if (testa == NULL) cout <<"la lista e' vuota"<prec == NULL) && (p->succ == NULL)) testa = NULL; //cancellazione in testa else if(p == testa){ testa = p->succ; testa->prec=0; }else if (p->succ == NULL) //cancellazione in coda p->prec->succ = 0; else { //cancellazione posizione generica p->succ->prec = p->prec; (p->prec)->succ = p->succ; } }else cout <<"Posizione non corretta"; } // da inserire in funzioni di servizio void Lista::stampalista(){ posizione p = primolista(); if(!listavuota()){ while(!finelista(p)){ cout << leggilista(p) << endl; p = succlista(p); } }else{ cout << "la lista e' vuota" << endl; } }
// nodolista.h #ifndef NODOLISTA_H #define NODOLISTA_H #include #include #include using namespace std; typedef string tipoelem; class NodoLista { public: tipoelem elemento; NodoLista* prec; NodoLista* succ; }; #endif
corso ASD