[C++] Creazione di una lista
Vorrei creare la classica lista che mi permetta di aggiungere elementi,toglierli,cercarli,stamparli..di seguito il codice da me scritto :
Il programma che utilizzo è il dev c++.
Le righe che mi danno problemi sono le seguenti :
.In altre parole l'unico problema è nell'eliminazione di un elemento che non si trovi in cima o che sia unico (fondo=cima).Con dei printf ho verificato che il programma entra negli if giusti quindi le condizioni sono corrette.Nonostante tutto,una volta entrato in else if((leggi==fondo)&&(x==leggi->numero)) o in ((leggi!=fondo)&&(leggi!=cima)) l'esecuzione si blocca e va tutto in palla (ovviamente non ho problemi a chiudere tutto).Non trattandosi di un for suppongo che questo venga causato dal fatto che punto ad un area di memoria riservata o comunque non disponibile ("in qualche modo").Purtroppo non capisco come mai in quanto mi sembra di puntare correttamente alle locazioni di memoria che ho riservato con le malloc e che quindi ho diritto di modificare .Non so se mi sono spiegato e se il codice è "capibile" .In caso contrario fa niente,non ammazzatevi per capire! Grazie in anticipo a chi risponderà!!
#include <cstdlib> #include <iostream> int i,x; using namespace std; struct lista{ int numero; struct lista *next; struct lista *previous; } *cima,*fondo,*attuale,*leggi,*leggi2,*cancella; void crea_lista () { printf("\ninserisci il primo elemento della lista:"); scanf("%d" ,&x); attuale=(lista *)malloc(sizeof(lista)); attuale->numero=x; cima=attuale; fondo=attuale; attuale->next=NULL; attuale->previous=NULL; } void add_element () { printf("\ninserisci l'elemento che desideri:"); scanf("%d" ,&x); attuale->next=(lista *)malloc(sizeof(lista)); attuale=attuale->next; attuale->numero=x; fondo=attuale; attuale->next=NULL; } void stampa () { for(leggi=cima;leggi->next!=NULL;leggi=leggi->next) { printf("\n%d\n" ,leggi->numero); } printf("\n%d\n" ,fondo->numero); printf("\nLa cima e':%d" ,cima->numero); printf("\nIl fondo e':%d" ,fondo->numero); } void elimina () { printf("\ninserisci il numero che vuoi eliminare:"); scanf("%d" ,&x); for(leggi=cima;((leggi->numero!=x)&&(leggi->next!=NULL));leggi=leggi->next) { } if(leggi==cima) { cima=leggi->next; cima->previous=NULL; cancella=leggi; free(cancella); } else if((leggi==fondo)&&(x==leggi->numero)) { fondo=leggi->previous; fondo->next=NULL; cancella=leggi; free(cancella); } else if((leggi!=fondo)&&(leggi!=cima)) { cancella=leggi; leggi2=leggi->next; leggi=leggi->previous; leggi->next=leggi2; free(cancella); } else { printf("\nl'elemento non e' presente nella lista!!"); } } void search () { int i=1; printf("\ninserisci il numero che vuoi cercare:"); scanf("%d" ,&x); for(leggi=cima;((leggi->numero!=x)&&(leggi->next!=0));leggi=leggi->next) { i++; } if(leggi->numero==x) { printf("\ntrovato! posizione numero:%d" ,i); } else { printf("\nl'elemento non e' presente!"); } } int main(int argc, char *argv[]) { printf("viene creata una lista"); crea_lista (); do { printf("\n1)Aggiungi elemento"); printf("\n2)Stampa la lista"); printf("\n3)Elimina un elemento"); printf("\n4)Cerca un elemento"); printf("\nScrivi il numero relativo all'azione che vuoi eseguire:"); scanf("%d" ,&x); if(x==1) { add_element(); } else if(x==2) { stampa(); } else if(x==3) { elimina(); } else if(x==4) { search(); } printf("\nVuoi chiudere il programma? 0=no ; altro numero=si:"); scanf("%d" ,&x); } while(x==0); system("PAUSE"); return EXIT_SUCCESS; }
Il programma che utilizzo è il dev c++.
Le righe che mi danno problemi sono le seguenti :
else if((leggi==fondo)&&(x==leggi->numero)) { fondo=leggi->previous; fondo->next=NULL; cancella=leggi; free(cancella); } else if((leggi!=fondo)&&(leggi!=cima)) { cancella=leggi; leggi2=leggi->next; leggi=leggi->previous; leggi->next=leggi2; free(cancella); }
.In altre parole l'unico problema è nell'eliminazione di un elemento che non si trovi in cima o che sia unico (fondo=cima).Con dei printf ho verificato che il programma entra negli if giusti quindi le condizioni sono corrette.Nonostante tutto,una volta entrato in else if((leggi==fondo)&&(x==leggi->numero)) o in ((leggi!=fondo)&&(leggi!=cima)) l'esecuzione si blocca e va tutto in palla (ovviamente non ho problemi a chiudere tutto).Non trattandosi di un for suppongo che questo venga causato dal fatto che punto ad un area di memoria riservata o comunque non disponibile ("in qualche modo").Purtroppo non capisco come mai in quanto mi sembra di puntare correttamente alle locazioni di memoria che ho riservato con le malloc e che quindi ho diritto di modificare .Non so se mi sono spiegato e se il codice è "capibile" .In caso contrario fa niente,non ammazzatevi per capire! Grazie in anticipo a chi risponderà!!
Risposte
Nella creazione della struttura non hai settato “previous”. Comunque l’impostazione del programma possiede a mio avviso molti problemi. Il correggerli richiederebbe di riscrivere praticamente tutto il programma quindi evito proprio di portare avanti il discorso.
Detto questo, “ti rendi conto che hai incluso iostream ma hai usato solo funzioni di cstdio?” Insomma dovresti cambiare l’include oppure usare cout e cin.
Il secondo commento è che nel C++, a differenza del C, struct definisce un tipo. Quindi puoi scrivere direttamente lista *next invece di struct lista *next.
Detto questo, “ti rendi conto che hai incluso iostream ma hai usato solo funzioni di cstdio?” Insomma dovresti cambiare l’include oppure usare cout e cin.
Il secondo commento è che nel C++, a differenza del C, struct definisce un tipo. Quindi puoi scrivere direttamente lista *next invece di struct lista *next.