Newsgroup: it.comp.lang.c++
Titolo: problemi liste collegate

ciao a tutti. Sto studiando le liste in c++ ed ho provato a realizzare una 
lista che inserisce i dati dalla coda.
Ho due domande:
 1) posso in qualche modo eliminare il nodo p1 che serve per iniziare a
riempire la lista ?
2) il programma sembra fare quello che deve, pero' quando arriva alla fine 
mi segnala un errore che però non riesco a capire...
il codice e' il seguente:
/*
  Bloodshed Dev-C++ Version 4.9.8.0
  Name: INSERIMENTO DATI NELLA LISTA DALLA CODA			
  Copyright: 
  Author: @LF
  Date: 13/02/04 08.58
  Description: 
*/
#include<iostream>
#include<cstdlib>
using namespace std;
struct nodo{
	int valore;
 	nodo* next;	
};
int main(){
	nodo *testa,*coda,*ultimo;
	int n=0;
	testa=new nodo;
	coda=new nodo;
	ultimo=new nodo;
	coda->next=coda;
	ultimo->next=coda;
	testa->next=coda;
	nodo* p1=new nodo;
	cout<<" immetti il primo valore della lista (-1 per finire ) :";
	cin>>p1->valore;
		if (p1->valore !=-1)
		{
  		p1->next=testa;
	    testa=p1;
        ultimo=p1;
          	//creazione della lista dalla coda.
			while (n!=-1)
		 	{
		  		nodo* nuovo=new nodo;
		  		nuovo->next=NULL;
		  		cout<<"immetti il valore del nuovo nodo (-1 per finire) : ";
		  		cin>>n;
		  			if (n != -1)
		  			{
		     			nuovo->valore=n;
		     			ultimo->next=nuovo;
		     			ultimo=nuovo;
		   			};
			};    	
        };
//  faccio la lettura della lista.
	while (testa->valore != NULL)
 	{
  		cout<<" "<<testa->valore<<" ";
  		testa=testa->next;
   	}; 	
    cout<<endl;
 
  	system("PAUSE");
return 0;
}
..grazie.
Alex
-----------------------------------------
Messaggio inviato con Excite Newsgroup.
http://www.excite.it/newsgroup

[cut]
Secondo me sarebbe piů carino, visto che parliamo di c++, creare una classe
lista e non mischiare tutto nel main, questo potrebbe evitarti una serie di
errori.
Per quanto riguarda il codice, che differenza c'č tra il puntatore alla coda
(*coda) e il puntatore all'ultimo nodo (*ultimo) ??? nessuna (visto che la
coda <č> l'ultimo nodo), quindi uno dei due č di troppo.
Non ha senso che i puntatori alla testa e alla coda vengano allocati, in
quanto sono dei <riferimenti> agli elementi della coda.
Sarebbe bello liberare le risorse allocate.
Io lo riscriverei cosě:
#include <iostream>
#include <stdlib.h>
using namespace std;
struct nodo_s
{
 int   valore;
 nodo_s*  next;
 nodo_s(int inValore = 0) :
   next(NULL),
   valore(inValore)
 {};
};
typedef nodo_s* ptr_nodo_t; // giusto per lo stile
class Lista
{
 private:
  ptr_nodo_t m_ptrTesta; // Puntatore alla testa
  ptr_nodo_t m_ptrCoda; // Puntatore alla coda
 public:
  // ctor
  Lista () :
   m_ptrTesta(NULL),
   m_ptrCoda(NULL)
  {};
  // dtor
  ~Lista ()
  {
   // Elimina tutti i nodi allocati
   ptr_nodo_t nodo = m_ptrTesta;
   while (nodo != NULL)
   {
    ptr_nodo_t next_nodo;
    delete nodo;
    nodo = next_nodo;
   }
    };
 public:
  // Aggiunge un nuovo nodo in coda
  void Accoda (ptr_nodo_t inNodo)
  {
   if (m_ptrCoda == NULL)
   {
    // Primo inserimento Testa=Coda=Nodo
    m_ptrTesta = inNodo;
    m_ptrCoda = inNodo;
   }
   else
   {
    // Inserimenti successivi
    m_ptrCoda->next = inNodo;
    m_ptrCoda = inNodo;
   }
  };
  // Visualizza tutti i nodi
  void Visualizza ()
  {
   ptr_nodo_t nodo = m_ptrTesta;
   while (nodo != NULL)
   {
    cout << nodo->valore << " ";
    nodo = nodo->next;
   }
   cout << "\n";
  }
};
int main(int argc, char *argv[])
{
 ptr_nodo_t nodo = NULL;
 int valore = 0;
   Lista lista;
 // Input
 while (valore != -1)
 {
  cout << "Inserire un valore (-1 per finire): ";
  cin >> valore;
  if (valore != -1)
  {
   lista.Accoda(new nodo_s(valore));
  }
 }
   lista.Visualizza();  // Visualizza i nodi inseriti
