Newsgroup: it.comp.programmare.win32
Titolo: Problemi con lista linkata

Salve ragazzi.
Avrei un paio di problemi relativa all'immissione e cancellazione di dati
all'interno di una lista ed in particolare in caso di lista vuota.
Se provo a rendere circolare una lista vuota non mi riesce, se contiene
almeno un elemento si.
Se provo ad inserire un elemento in una lista circolare vuota mi da errore.
Se provo ad eliminarlo, idem, mentre se ne contiene almeno 1 funziona tutto
bene.
Cosa sarà?
Vi posto il codice così ci date un'occhiata.
#include <iostream.h>
#include <conio.h>
typedef struct Nodo {
  int info;
  Nodo *succ;
} Nodo;
Nodo *InserisciNodoInTesta(Nodo *Lista, int dato) {
  Nodo *k=new Nodo;
  k->info=dato;
  k->succ=Lista;
  Lista=k;
  return Lista;
}
Nodo *InserisciNodoInCoda(Nodo *Lista, int dato) {
  Nodo *p=Lista;
  Nodo *t=Lista;
  while (p!=NULL) {
    p=p->succ;
    if (p!=NULL)
      t=p;
  }
  Nodo *k=new Nodo;
  t->succ=k;
  k->info=dato;
  k->succ=NULL;
  return Lista;
}
Nodo *RendiListaCircolare(Nodo *Lista) {
  Nodo *p=Lista;
  Nodo *t=Lista;
  while (p!=NULL) {
    p=p->succ;
    if (p!=NULL)
      t=p;
  }
  if (t!=p)
    t->succ=Lista;
  return Lista;
}
void Stampa(Nodo *Lista) {
  Nodo *p=Lista;
  while (p!=NULL) {
    cout << p->info << " ";
    p=p->succ;
  }
}
void StampaListaCircolare(Nodo *Lista) {
  Nodo *t=Lista;
  if (t!=NULL) {
    do {
      cout << t->info << " ";
      t=t->succ;
    } while (t!=Lista);
  }
}
Nodo *InserimentoDiUnNodoInUnaListaCircolare(Nodo *Lista, int dato) {
  Nodo *p=Lista;
  Nodo *t=Lista;
  if (t!=NULL) {
    do {
      p=p->succ;
      if (p!=Lista)
        t=p;
    } while (p!=Lista);
  }
  Nodo *k=new Nodo;
  t->succ=k;
  k->info=dato;
  k->succ=Lista;
  return Lista;
}
Nodo *CancellazioneDiUnNodoInUnaListaCircolare(Nodo *Lista, int dato) {
  Nodo *t=Lista;
  Nodo *p=Lista;
  if (t!=NULL) {
    do {
      if (t->info==dato) {
        if (t==Lista) {
          while (p->succ!=Lista)
            p=p->succ;
          if (t->succ==Lista)
            Lista=NULL;
          else {
            Lista=t->succ;
            p->succ=Lista;
          }
        }
        else
          p->succ=t->succ;
        delete t;
        t=Lista;
      }
      else
        p=t;
    t=t->succ;
    } while (t!=Lista);
  }
  return Lista;
}
void main() {
  Nodo *Lista;
  Lista=NULL;
  randomize();
  int x=0;
  do {
    cout << "Inserisci La Chiave Da Inserire (In Testa, 0=Fine): ";
    cin >> x;
    if (x!=0)
      Lista=InserisciNodoInTesta(Lista,x);
  } while (x!=0);
  Stampa(Lista);
  cout << endl;
  do {
    cout << "Inserisci La Chiave Da Inserire (In Coda, 0=Fine): ";
    cin >> x;
    if (x!=0)
      Lista=InserisciNodoInCoda(Lista,x);
  } while (x!=0);
  Stampa(Lista);
  cout << endl;
  Lista=RendiListaCircolare(Lista);
  StampaListaCircolare(Lista);
  cout << endl << "Inserisci La Chiave Da Inserire (In Lista Circolare): ";
  cin >> x;
  Lista=InserimentoDiUnNodoInUnaListaCircolare(Lista,x);
  StampaListaCircolare(Lista);
  cout << endl << "Inserisci La Chiave Da Eliminare (In Lista Circolare): ";
  cin >> x;
  Lista=CancellazioneDiUnNodoInUnaListaCircolare(Lista,x);
  StampaListaCircolare(Lista);
  while (!kbhit());
}
-- 
Karletto
chiamac...@tiscalinet.it
http://www.carletto.cjb.net

   while (p!=NULL) {
...
Se la lista e' vuota, il parametro Lista e' NULL, quindi *p = NULL e
scrivere p != NULL non ha senso! I problemi nascono da qui, in effetti
rendere circolare una lista vuota non ha senso. Inserisci un controllo che
verifichi che ci sia almeno 1 elemento.
ciao
marco


Giusto! Inizierò di qui, lo provo subito...
Grazie 1000.
Ciao