|
|
|
![]() |
|
Strumenti |
![]() |
#1 | ||
Senior Member
Iscritto dal: Nov 2002
Città: Cagliari
Messaggi: 844
|
[C] problemi di pila...
Ciao ragazzi, è da un sacco che non posto qui ma da quando mi sono iscritto in informatica penso che torneremo a sentirci qualche volta
![]() Il mio problema è questo: in facoltà stiamo facendo liste fifo e lifo, io sono 3 giorni che mi scranio su questa storia e finalmente sono riuscito a far girare un programma stupidissimo che però mi da qualche problema. Codice:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> //struttura di elemento struct elemento{ int inf; struct elemento *pun; } //main main(){ struct elemento *puntatesta = NULL; struct elemento *puntaultimo = NULL; struct elemento *puntapenultimo = NULL; struct elemento *tmp = NULL; int scelta = -1; int ele; //menu while(scelta!=0){ printf("\n\n---------------------\nGestione di una pila\n\n0)esci\n1)inserisci elemento\n2)elimina ultimo elemento inserito\n3)visualizza la pila\n---------------------\nscelta: "); scanf("%d", &scelta); switch(scelta){ //aggiungo un elemento case 1: //se è il primo gli associo puntatesta if(puntatesta==NULL){ puntaultimo=(struct elemento *)malloc(sizeof(struct elemento)); printf("\n\ninserisci il primo valore: "); scanf("%d",&puntaultimo->inf); printf("verifica: %d",puntaultimo->inf); puntatesta=puntaultimo; puntaultimo->pun=NULL; puntapenultimo=puntatesta; } //se no gli assocuo puntaultimo else{ puntapenultimo=puntaultimo; puntaultimo=puntaultimo->pun; puntaultimo=(struct elemento *)malloc(sizeof(struct elemento)); printf("\n\ninserisci il valore: "); scanf("%d",&puntaultimo->inf); printf("verifica: %d",puntaultimo->inf); puntaultimo->pun=NULL; } break; //elimino l'ultimo elemento inserito e faccio puntare a punta ultimo il penultimo elemento memorizzato grazie a puntapenultimo case 2: if(puntaultimo!=NULL && puntaultimo!=puntatesta){ printf("\n\nEliminazione dell'ultimo elemento inserito\nUltimo elemento: %d", puntaultimo->inf); free(puntaultimo); puntaultimo=puntapenultimo; } else printf("\n\nEliminazione del primo elemento inserito\nelemento: %d", puntatesta->inf); free(puntatesta); puntatesta=NULL; break; //visualizzo la pila case 3: printf("\n\nvisualizzazione della pila:"); //se esiste il primo elemento procedo if(puntatesta==NULL) printf("\n\nNon ci sono elementi nella pila!"); else{ //stampo tutti i dati contenuti in tmp facendolo passare dal primo elemento della pila (puntatesta) fino all'ultimo(finche non diventa NULL) tmp=puntatesta; while(tmp!=NULL){ printf("\n%d",tmp->inf); tmp=tmp->pun; } } break; default: printf("\n\ninserisci un numero corretto"); } } ![]() I problemi sono: 1) I dati li memorizza però se faccio "stampare" la lista mi fa vedere solo il primo. Eppure sono sicuro che li memorizzi tutti perchè se vado ad eliminare un dato funziona tutto -quasi- alla perfezione 2)In che modo posso far eliminare l'ultimo dato e far puntate puntaultimo al penultimo per poi libere la memoria? Nel codice ho usato *puntapenultimo da sostituire a *puntaultimo se si cancella un elemento ma proprio mentre scrivevo qui mi sono accorto di aver fatto un immane cacchiata ![]() ![]() Quote:
![]() PS: cionci conto su di te, il mio nick ti dovrebbe dire qualcosa ![]() PPS: Perchè vuole una riga bianca alla fine? ![]() Quote:
__________________
Non ho paura dei computer, ma della loro eventuale mancanza. (Asimov) Una delle principali cause della caduta dell'Impero Romano fu che, privi dello zero, non avevano un modo per indicare la corretta terminazione dei loro programmi C. (Firth) Ultima modifica di Louder Than Hell : 09-12-2005 alle 10:25. |
||
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2002
Città: Cagliari
Messaggi: 844
|
Quote:
![]() Utilizzi alcune cose che io non ho ancora fatto tipo memset, gli ho dato un occhiata ed è strutturato in modo un pò diverso dal mio. Ora gli occhi mi stanno esplodento mi prendo una pausa e lo analizzo più avanti con calma. La curiosità di sapere come mai Codice:
while(tmp!=NULL){ printf("\n%d",tmp->inf); tmp=tmp->pun; } ![]() ![]()
__________________
Non ho paura dei computer, ma della loro eventuale mancanza. (Asimov) Una delle principali cause della caduta dell'Impero Romano fu che, privi dello zero, non avevano un modo per indicare la corretta terminazione dei loro programmi C. (Firth) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2002
Città: Cagliari
Messaggi: 844
|
Ottimo ho modificato un pò di cosette ed ora sembra funzionare tutto:
Codice:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> //struttura di elemento struct elemento{ int inf; struct elemento *next; struct elemento *prev; } //main main(){ struct elemento *puntatesta = NULL; struct elemento *puntaultimo = NULL; struct elemento *tmp = NULL; int scelta; int ele; //menu do{ printf("\n\n---------------------\nGestione di una pila\n\n0)esci\n1)inserisci elemento\n2)elimina ultimo elemento inserito\n3)visualizza la pila\n---------------------\nscelta: "); scanf("%d", &scelta); switch(scelta){ //aggiungo un elemento case 1: //se è il primo gli associo puntatesta if(puntatesta==NULL){ puntaultimo=(struct elemento *)malloc(sizeof(struct elemento)); printf("\n\ninserisci il primo valore: "); scanf("%d",&puntaultimo->inf); printf("verifica: %d",puntaultimo->inf); puntatesta=puntaultimo; puntatesta->next=NULL; } //se no gli associo puntaultimo else{ puntaultimo->next=(struct elemento *)malloc(sizeof(struct elemento)); tmp=puntaultimo; puntaultimo=puntaultimo->next; puntaultimo->prev=tmp; printf("\n\ninserisci il valore: "); scanf("%d",&puntaultimo->inf); printf("verifica: %d",puntaultimo->inf); puntaultimo->next=NULL; } break; //elimino l'ultimo elemento inserito case 2: if(puntatesta==NULL){ printf("\n\nnon ci sono elementi da eliminare!"); break; } else if(puntatesta==puntaultimo){ printf("\n\nEliminazione del primo elemento inserito\nelemento: %d", puntatesta->inf); free(puntatesta); puntatesta=NULL; break; } else if(puntaultimo!=puntatesta){ printf("\n\nEliminazione dell'ultimo elemento inserito\nUltimo elemento: %d", puntaultimo->inf); tmp=puntaultimo->prev; free(puntaultimo); puntaultimo=tmp; puntaultimo->next=NULL; break; } //visualizzo la pila case 3: printf("\n\nvisualizzazione della pila:"); //se esiste il primo elemento procedo if(puntatesta==NULL) printf("\n\nNon ci sono elementi nella pila!"); else{ //stampo tutti i dati contenuti in tmp facendolo passare dal primo elemento della pila (puntatesta) fino all'ultimo(finche non diventa NULL) tmp=puntatesta; while(tmp!=NULL){ printf("\n%d",tmp->inf); tmp=tmp->next; } } break; default: printf("\n\ninserisci un numero corretto"); } }while(scelta!=0); } ![]()
__________________
Non ho paura dei computer, ma della loro eventuale mancanza. (Asimov) Una delle principali cause della caduta dell'Impero Romano fu che, privi dello zero, non avevano un modo per indicare la corretta terminazione dei loro programmi C. (Firth) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:49.