|
|||||||
|
|
|
![]() |
|
|
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 11: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: 12:36.




















