Newsgroup: it.comp.lang.c++
Titolo: Non risco a trovare l'errore

Ciao!
Qui sotto c'è un piccolo programma che dovrebbe costruire una lista linkata,
molto semplice, però già così non riesco a farla andare...
Qualcuno mi sa dire dove sbaglio?
Io non capisco proprio...
grazie
#include <iostream>
#include <string.h>
class nodo{
public:
 nodo *next;
 char *dato;
};
class lista{
private:
 nodo *header;
 nodo *current;
public:
 lista(){
  header = new nodo;
  header->next = NULL;
  current = header->next;
 }
 void accoda(char *stringa){
  current = new nodo;
  current->dato = new char[strlen(stringa)+1];
  strcpy(current->dato,stringa);
  current->next = NULL;
  current = current->next;
 }
 void GoToFirst(){
  current = header->next;
 }
 char *leggi(){
  return current->dato;
 }
};
void main(void){
 lista l1;
 l1.accoda("parola");
 l1.GoToFirst();
 cout << l1.leggi() << "\n";
}


Ciao
Mauro

}
Devi cambiare la funzione di inserimento: scorri la list e trova
l'ultimo inserito, poi aggiungi un elemento. La variabile current
usata in  questo modo non serve a nulla, a meno che non punti
all'ultimo elemento inserito (e non al primo libero!).
E.
-----------------------------------------------------
do#.
min...@infinito.it
pregasi abbassare di un semitono :-)
-----------------------------------------------------

Oooops!
Il tutto funziona se modifichi la linea nel costruttore in cui aggiorni
current:
cioe´ da :
current = header->next;
a
current = header;
Scusa ma non l´avevo notato prima.
Ciao
Mauro

Scusami , ma anche in accoda c´e´ questo deleterio assegnamento di
current a current -> next che non fa funzionare il tutto:
ti posto il codice finale (spero):
#include <iostream>
#include <string.h>
using namespace std;
class nodo{
public:
 nodo *next;
 char *dato;
};
class lista{
private:
 nodo *header;
 nodo *current;
public:
 lista(){
 header = new nodo;
 header->next = NULL;
 current = header;
}
void accoda(char *stringa){
current = new nodo;
current->dato = new char[strlen(stringa)+1];
strcpy(current->dato,stringa);
current->next = NULL;
}
void accoda(char *stringa)
{
    nodo *tmpnodop;
    tmpnodop = current; // qui ti metti da parte current in un puntatore
temporaneo
   current = new nodo;
   current->dato = new char[strlen(stringa)+1];
   strcpy(current->dato,stringa);
   current->next = NULL;
   tmpnodop->next = current; // qui colleghi il nodo precedente al nodo
appena accodato
   current = current->next;
}
// distruttore che ripulisce l´heap
~lista()
{
    nodo *p = header;
    while (p->next != NULL)
    {
        current = p->next;
        delete p;
        p = current;
    }
    delete current;
}
 void GoToFirst(){
  current = header->next;
 }
 char *leggi(){
  return current->dato;
 }
};
// il main in c++ standard restituisce un int e non un void
int main(void)
{
 lista l1;
 l1.accoda("parola");
 l1.GoToFirst();
 cout << l1.leggi() << "\n";
return 0;
}
Ciao
Mauro

Scusami , ma anche in accoda c´e´ questo deleterio assegnamento di
current a current -> next che non fa funzionare il tutto:
ti posto il codice finale (spero):
#include <iostream>
// questo a cosa ti serve se non usi le stringhe?
#include <string.h>
using namespace std;
class nodo{
public:
nodo *next;
char *dato;
};
class lista{
private:
nodo *header;
nodo *current;
public:
lista(){
header = new nodo;
header->next = NULL;
current = header;
}
void accoda(char *stringa)
{
    nodo *tmpnodop;
    tmpnodop = current; // qui ti metti da parte current in un puntatore
temporaneo
   current = new nodo;
   current->dato = new char[strlen(stringa)+1];
   strcpy(current->dato,stringa);
   current->next = NULL;
   tmpnodop->next = current; // qui colleghi il nodo precedente al nodo
appena accodato
}
// distruttore che ripulisce l´heap
~lista()
{
    nodo *p = header;
    while (p->next != NULL)
    {
        current = p->next;
        delete p;
        p = current;
    }
    delete current;
}
void GoToFirst(){
  current = header->next;
}
char *leggi(){
  return current->dato;
}
};
// il main in c++ standard restituisce un int e non un void
int main(void)
{
lista l1;
l1.accoda("parola");
l1.GoToFirst();
cout << l1.leggi() << "\n";
return 0;
}
Ciao
Mauro
p.s.
lo so....non ho dormito molto stanotte, scusate i 167 posts....

[CUT]
La classe string del C++ non è contenuta in <string.h> ma in <string>,
<string.h> è stato incluso per utilizzare funzioni sulle stringhe C
come strcpy.
In C++ è meglio comunque usare <cstring> piuttosto che <string.h>
Ciao
Marco Barisione (ICQ 84277092)