Newsgroup: it.comp.lang.c++
Titolo: Ordinamento lista

Salve NG,
Avrei un problemino: col programma che sto postando sotto gestisco una
classe template Lista che contiene una lista di candidati (Nome e Cognome) e
relativo punteggio ottenuto (Punteggio).
Tutto funziona tranquillamente, io inserisco i candidati e visualizzo nome
cognome e punteggio.
Ora vorrei inserire un metodo ordina che mi ordina appunto i nomi dei
candidati per punteggio ottenuto in ordine decrescente ed in caso di
punteggio uguale, in ordine alfabetico...
Come posso fare ad ordinare questa lista? Esiste qualcosa tipo Sort per le
liste oppure no?
Devo crearmela io e se si come? (Siate dettagliati non ne capisco molto...)
Vi incollo il programma cosě ci date un'occhiata.
Ciao e grazie...
Please aiutatemi č urgente.
#include <iostream.h>
template <class L> class Concorrente
{
public:
  L dato;
  Concorrente<L> *successivo;
  Concorrente<L>(L d, Concorrente<L> *n=0) : dato(d), successivo(n) {}
};
template <class L> class Lista {
  Concorrente<L> *cima;
  Concorrente<L> *coda;
  int conta;
  public:
  //Costruttore
  Lista():cima(0),coda(0),conta(0){}
  //Distruttore
  ~Lista() {
    Concorrente<L> *concorrente = cima;
    while (concorrente) {
      cima = concorrente->successivo;
      delete concorrente;
      concorrente = cima;
    }
  }
  virtual bool Push(L &d)
  {
    Concorrente<L> *p = new Concorrente<L>(d);
    if (!p)
    {
      cerr << "\nMemoria esaurita\n";
      return false;
    }
    if (cima) coda->successivo = p;
    else cima = p;
    coda = p;
    conta++;
    return true;
  }
  virtual L Pull()
  {
    Concorrente<L> *p = cima;
    Dato d;
    if (p)
    {
      d = p->dato;
      cima = p->successivo;
      delete(p);
      conta--;
    }
    return d;
  }
  virtual double N_Concorrenti()
  {
    return conta;
  }
};
typedef struct Dato {
  char Cognome[20];
  char Nome[20];
  int Punteggio;
  int Continua;
} Dato;
//COLLAUDO
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
void main()
{
  Lista<Dato> lista;
  Dato dato;
  char risposta;
  cout << "Immissione di un concorrente (S/N)? ";
  cin >> risposta;
  if ((risposta=='s') || (risposta=='S')) dato.Continua=1;
  else dato.Continua=0;
  while (dato.Continua)
  {
    //Controllo
    cout << "Inserisci il cognome: ";
    cin >> dato.Cognome;
    cout << "Inserisci il nome: ";
    cin >> dato.Nome;
    cout << "Inserisci il punteggio: ";
    cin >> dato.Punteggio;
    //Immissione
    if (!(lista.Push(dato))) return;
    cout << "Immissione di un concorrente (S/N)? ";
    cin >> risposta;
    if ((risposta=='s') || (risposta=='S')) dato.Continua=1;
    else dato.Continua=0;
  } //fine while
  cout << endl;
  cout << "Procedere allo svuotamento della lista (S/N)? ";
  cin >> risposta;
  if (risposta!='S' && risposta!='s') return;
  while (lista.N_Concorrenti())
  {
    dato = lista.Pull();
    cout << setw(10) << dato.Cognome << " " << dato.Nome << " " <<
dato.Punteggio << endl;
  }
  cout << "La memoria e' stata liberata";
  while (!kbhit());
}
--
----------------------------------------
Carlo Camarda
chiamac...@tiscalinet.it
]@#[ Anna I Love You ]#@[

Dunque, la cosa che mi pare piu' ovvia sarebbe quella di inserire un
campo ID nella struct
Dato che registri appunto l'ID del concorrente (ad esempio il posto che
occupa all'interno
della lista). Poi magari ti crei un bel vettore di int inizializzandolo
ai valori degli ID dei vari
concorrenti e 'ordini' quello. Mi spieghero' meglio con un esempio:
int * vettore = new int [lista.N_Concorrenti()];
dato = lista.cima;                                             // ti
consiglio di fare dei metodi apposta per questo
for(int i = 0; i < lista.N_Concorrenti(); i ++){
   vettore[i] = dato.ID;
   dato = lista.successivo;                              // ti consiglio
di fare dei metodi apposta per questo
   }
Ora che hai il vettore di ID lo ordini (solo il vettore pero' )
confrontando i corrispondenti
elementi della lista, magari implementando un metodo retrieve(int ID)
che ritorni il Dato con
l'ID specificato e magari anche un quicksort ad oc (se non riesci a
trovare il codice, fammi
un fischio che te lo passo io).
A questo punto non serve far altro che stampare i concorrenti
nell'ordine dato dagli ID del
vettore, semplice no?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG



Provo a fare una specie di bubblesort (metodo proprio della lista):
void Bubble_Sort (void)
{bool ch;
 Concorrente <L> *c;
 int i, j;
 L tmp;
 for (i = conta, ch = true; i > 1 && ch; i--)
  for (c = cima, j = 0, ch = false; c != NULL && j < i; j++)
   if (c->successivo != NULL && c->dato < (c->successivo)->dato)
   {tmp = c->dato;
    c->dato = (c->successivo)->dato;
    (c->successivo)->dato = tmp;
    ch = true;
   }
}
Chiaramente per la classe L (nella fattispecie la struttura Dato) devi
ridefinire:
- l'operatore < (minore);
- l'operatore = (assegnazione).
dal momento che hai usato un oggetto template. Spero di non aver scrito
fesserie, in tal caso fammi sapere cosa non va. Ciao
                    Marchisio Stefano