Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [c++]stack doppio

    Ho qualche problema a implementare uno stack doppiamente linkato... uno stack normale l'avevo fatto ora mi sto ciminando in questo ma c'è qualche errore che non capsico..

    Premetto che "lst=NULL" e che così funzionava
    codice:
     void Bastoncino::Push(int elemento){
          stack *tmp=new stack;
          tmp->raggio=elemento;
          tmp->succ=lst;
          lst=tmp;
     }
    Ho fatto queste modifiche (lst=NULL)
    codice:
     void Bastoncino::Push(int elemento){
          stack *tmp=new stack;
          tmp->raggio=elemento;
          tmp->succ=lst;
          tmp->prec=tmp;
          lst=tmp;
    
       }
    come posso correggere?

  2. #2
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ho provato anche a inizializzare li puntatore fst a NULL... ma niente da fare....

    coas posso fare?

  3. #3
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ho ricorretto così:
    codice:
       void Bastoncino::Push(int elemento){
          stack *tmp=new stack;
          tmp->raggio=elemento;
    	  tmp->succ=lst;
          lst->prec=tmp;
    	  lst=tmp;
    
       }
    ma continua a non funzionare... come posso correggerlo?

  4. #4
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ho capito l'errore.... non posso scrivere "lst->prec=tmp;" perchè lst è inizializzato a NULL... ma ancora non riesco a capire come correggere...

  5. #5
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    ti ci vorrà un controllo... se lst (è un campo dati della classe? è il puntatore al primo elemento?) è null non c'è nessun elemento.
    in tal caso farai così:

    codice:
    void Bastoncino::Push(int elemento){
          stack *tmp=new stack;
          tmp->raggio=elemento;
    	  tmp->succ=lst;
          tmp->prec=lst;
    	  lst=tmp;
    
       }
    credo che non ti serva nemmeno l'else perchè lo fai sempre puntare a lst... se è vuota punterà a null, se invece c'è qualcosa punterà all'indirizzodi lst, che diventerà quindi il secondo elemento...

    ps: ma quel lst=tmp sicuro che modifichi il puntatore lst anche quando restituisce il controllo al chiamante? Secondo me o usi un return con assegnazione oppure devi usare un puntatore a puntatore.

    sempre se non sbaglio...

  6. #6
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Allora... ho questo stack... fino a quando avevo solo il puntatore che puntava all'elemtno successivo funzionava... quindi si...quel lst=tmp dovrebbe modificare il puntatore...

    lst è il puntatore che punta al primo elemnto dello stack... dunque questo varia ogni qualvolta faccio un push o un pop... e inizilamnte è puntato a null...

    Non ho capito bene il codice che hai postato....

    tmp->succ=lst;
    tmp->prec=lst;

    così non fai la stessa cosa? dunque entrambi puntano al successivo....

    non capisco proprio....

  7. #7
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    scusa, ero di fretta. Ora: se non ci sono elementi deve puntare a null sia il puntatore precedente che quello successivo, altrimenti va modificato il succ di tmp e il prec di lst.

    codice:
    void Bastoncino::Push(int elemento){
       stack *tmp=new stack;
       tmp->raggio=elemento;
       tmp->prec=NULL;
       tmp->succ=NULL;
       if (lst!=NULL){
          tmp->succ=lst;
          lst->prec=tmp;
       }
       lst=tmp;
    }
    riguardo all'istruzione lst=tmp, niente, se è un campo dati della classe e lo inizializzi a null tramite il costruttore dovrebbe andar bene, è nel caso di una funzione con lst come variabile del main che andrebbe usato il return o un doppio puntatore.

    Forse l'errore che continuava a darti era dovuto principalmente al fatto che non gestivi l'inserimento come primo elemento... fai sapere se funziona.
    Comunque, se non è un esercizio didattico, in c++ c'è una classe nella STL già pronta.

  8. #8
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Ok ti ringrazio ci siamo quasi.... è un pò diverso da come l'hai scritto tu perchè siccome è un metodo della classe ho dovuto cambiare un pò il codice però mi hai dato l'ispirazione grazie...

    codice:
     void Bastoncino::Push(int elemento){
    		stack *tmp=new stack;
    		tmp->raggio=elemento;
    		tmp->succ=lst;
    		if(lst!=NULL)
    			lst->prec=tmp;
    		else
    			fst=tmp;
    		lst=tmp;
    
       }

  9. #9
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Questa cosa è assurda...
    Allora come avete capito è una classe... io creo 2 stack .. cosa faccio... sposto gli elementi dal primo al secondo stack e li visualizzo... nessun problema fino a quando sposto TUTTI gli elementi nel secondo stack.... il primo stack è vuoto e non me lo stampa, il secondo stack è pieno di tot elementi e me li stampa tutti... ma non esce dal programma... non crasha... non fa nulla.... è rimasto fermo li!!!! Ormai sono minuti sto aspettando che crashi ma nulla...

    EDIT: Ho scoperto quello che è... il processo di stampa funziona perfettamente.. infatti poi esce dalla funzione e torna nel main... c'è qualche problema nel distruttore... ora modifico quello!

  10. #10
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    infatti... ho tolto l'istruzione "free(fst)" e ora funziona... può essere che dava errore perchè fst=NULL???

    non la capisco sta cosa...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.