Newsgroup: it.comp.lang.c++
Titolo: Liste allocate dinamicamente con catena di puntatori

Qualcuno sa spiegarmi come si procede per creare suddetta lista? Grazie
mille.


questo codice che vedi sotto implementa una classe lista dinamica con l'uso
di puntatori!
In pratica definisci un record con un campo elmento di tipo intero in questo
caso, ed un campo punatore a record!
L'attributo ' l ' che definisci nella classe è un puntatore al primo
elemento della lista.
Per i metodi si possono utilizzare anche procedure di tipo ricorsivo ma
penso che queste iterative si capiscano meglio se non conosci bene le liste,
al contrario, invece delle strutture dati ad albero, che si prestano meglio
se implementate con procedure di tipo ricorsivo.
Ti dico da subito che qualcuno scrivera che il codice non è standard ma non
ti preoccupare va bene cmq l'importante è che lavori sotto windows.
//QUESTO è L'HEADER FILE
#ifndef CLISTADIN_H
#define CLISTADIN_H
#include <iostream.h>
#include <stdlib.h>
typedef int E;
struct Record;
typedef Record* L;
struct Record{
   E elem;
   L punt;
};
class ListaOrd{
  private:
  L l;
  public :
  ListaOrd();
  bool empty()const;
  void push(const E e);
  void pop(E & e);
  void top(E & e)const;
  void elimina(const E e);
  void inserisce(E & e);
  bool inlist(E e)const;
  void clear();
  void stampa()const;
  ~ListaOrd();
};
#endif
//QUESTO è IL CPP
#include "Clistadin.h"
ListaOrd::ListaOrd(){
    l = 0;
}
bool ListaOrd::empty()const{
   return l == 0;
}
void ListaOrd::push(const E e){
    L q = new Record;
    q -> elem = e;
    q -> punt = l;
    l = q;
}
void ListaOrd::pop(E & e){
  e = l -> elem;
  L p = l;
  l = l -> punt;
  delete p;
}
void ListaOrd::top(E & e)const{
  if(l != 0)
   e = l -> elem;
    else
     cout << "\nLista vuota per richiesta top!" << endl;
}
void ListaOrd::elimina(const E e){
    L prec, succ;
    prec = 0;
    succ = l;
    while(succ != 0 && e > succ -> elem){
         prec = succ;
         succ = succ -> punt;
    }
     if(succ == 0)
       cout << "\nElemento non presente";
      else{
        if(succ -> elem == e){
           if(prec == 0){
             l = succ -> punt;
             delete succ;
           }else{
              prec -> punt = succ -> punt;
              delete succ;
            }
         }else
               cout << "Elemento non presente";
      }
}
void ListaOrd::inserisce(E & e){
    L q = new Record;
    q -> elem = e;
   if(l == 0 || e < l -> elem){
     q -> punt = l;
     l = q;
    } else{
       L prec = 0;
       L succ = l;
       while(succ != 0 && e > succ -> elem){
         prec = succ;
         succ = succ -> punt;
       }
         prec -> punt = q;
         q -> punt = succ;
      }
}
bool ListaOrd::inlist(E e)const{
bool trovato = false;
 L q = l;
   while ((q != NULL) && (e > q ->elem)){
  q = q->punt;
 }
 if ((q != NULL) && (q->elem == e))
  trovato = true;
return trovato;
}
void ListaOrd::clear(){
    while(l != 0)
     l = l -> punt;
     delete l;
}
void ListaOrd::stampa()const{
     for(L q = l; q != 0; q = q -> punt){
         cout << q -> elem << " ";
     }
}
ListaOrd::~ListaOrd(){
   clear();
}
//QUESTO è PER L'UTILIZZO PER CLASSE
#include "Clistadin.h"
// Prototipi di funzioni definite in questo modulo
void presenta_menu(int & scelta);
void inserimentointesta (ListaOrd & lista);
void analisi(const ListaOrd & lista);
void estrazioneintesta(ListaOrd & lista);
void inserimento(ListaOrd & lista);
void estrazione(ListaOrd & lista);
void ricerca(ListaOrd& lista);
void print(const ListaOrd& lista);
void main(void) {
ListaOrd lista; //definisce variabile di tipo lista
int scelta, esci=0;
 do {
    presenta_menu(scelta);
    switch (scelta) {
       case 1: inserimentointesta(lista);break;
       case 2: analisi(lista);break;
       case 3: estrazioneintesta(lista);break;
       case 4: inserimento(lista);break;
       case 5: estrazione(lista);break;
          case 6: ricerca(lista);break;
    case 7: print(lista);break;
    case 8 : lista.clear();break;
          case 9: esci=1;break;
    default: cout << "\n opzione errata!";
    }
 } while (!esci);
}
void presenta_menu(int& scelta) {
 do {
 // stampa il menu' delle operazioni previste
    cout<<"\n\n\n   Gestione di una lista dinamica";
    cout<<"\n1) Inserimento in testa di un elemento\n  ";
    cout<<"\n2) Analisi dell''elemento affiorante\n ";
    cout<<"\n3) Estrazione dell'elemento di testa\n ";
    cout<<"\n4) Inserimento di un elemento in una lista ordinata\n ";
    cout<<"\n5) Cancellazione di un elemento (anche in lista ordinata)\n ";
    cout<<"\n6) Ricerca di un elemento\n ";
    cout<<"\n7) Visualizza la lista\n ";
    cout<<"\n8) Svuota la lista\n ";
       cout<<"\n9) Fine\n ";
    cout<<"\n Inserisci una opzione: ";
    cin>>scelta;
    cout << "\n";
 } while ((scelta<1)||(scelta>9));
}
void inserimentointesta(ListaOrd& lista) {
E e ;
 cout<<"Opzione 1 - inserimento di un elemento in testa\n ";
 cout<<"elemento= "; cin>>e;
    lista.push(e);
}
void analisi(const ListaOrd& lista) {
E e;
 cout<<"Opzione 2 - analisi dell''elemento affiorante\n ";
 if (!lista.empty()) {
  lista.top(e);
  cout<<"\nelemento = "<<e;
 }
 else cout<<"\nLista vuota operazione impossibile\n ";
}
void estrazioneintesta(ListaOrd& lista) {
E e;
 cout<<"Opzione 3 - estrazione di un elemento in testa\n ";
 if (!lista.empty()) {
  lista.pop(e);
  cout<<"\nelemento = "<<e;
 }
 else cout<<"Lista vuota estrazione impossibile\n ";
}
void inserimento(ListaOrd& lista) {
E e ;
 cout<<"Opzione 4 - inserimento di un elemento\n ";
 cout<<"elemento= "; cin>>e;
     lista.inserisce(e);
}
void estrazione(ListaOrd& lista) {
E e;
 cout<<"Opzione 5 - cancella un elemento\n ";
 if (!lista.empty()) {
  cout<<"elemento da eliminare= "; cin>>e;
  lista.elimina(e);
  cout<<"\nelemento = "<<e;
 }
 else cout<<"Lista vuota cancellazione impossibile\n ";
}
void ricerca(ListaOrd& lista){
E e ;
 cout<<"Opzione 6 - ricerca di un elemento\n ";
 cout<<"elemento da cercare= "; cin>>e;
  if (!lista.empty()) {
  if (lista.inlist(e)) cout << "\n elemento presente!";
  else cout << "\n elemento non presente!";
 }
 else cout<<"\n Lista vuota\n ";
}
void print(const ListaOrd& lista) {
 cout<<"Opzione 7 - stampa della lista\n ";
 if (!lista.empty())
  lista.stampa();
  else cout << "\nLista vuota!";
}

Sei davvero gentile!
Grazie 1000!


Prego!Se posso perchč non aiutare?