PDA

View Full Version : [C] problemi di pila...


Louder Than Hell
09-12-2005, 10:19
Ciao ragazzi, è da un sacco che non posto qui ma da quando mi sono iscritto in informatica penso che torneremo a sentirci qualche volta :D

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.

#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");
}
}


Sper sia leggibile..non sono abituato a far leggere il mio codice :D

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:asd::asd::
Eliminazione dell'ultimo elemento inserito
*** glibc detected *** double free or corruption (fasttop): 0x0804a008 ***
Ultimo elemento: 134520848Aborted (core dumped)


Ho visto che siete molto gentili con i niubbi per cui vi ringrazio sin d'ora per l'immenso aiuto che mi darete :D

PS: cionci conto su di te, il mio nick ti dovrebbe dire qualcosa :read:

PPS: Perchè vuole una riga bianca alla fine? :confused: pila3.c:86:2: warning: no newline at end of file

andbin
09-12-2005, 11:37
Ciao, in <questo> (http://www.hwupgrade.it/forum/showthread.php?t=1079438) thread ho postato un sorgente per la gestione di una coda (fifo). Vedi se magari ti può essere utile.

Louder Than Hell
09-12-2005, 11:49
Ciao, in <questo> (http://www.hwupgrade.it/forum/showthread.php?t=1079438) thread ho postato un sorgente per la gestione di una coda (fifo). Vedi se magari ti può essere utile.
Grazie andrea, avevo già cercato ma quel thread non l'avevo visto ;)
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
while(tmp!=NULL){
printf("\n%d",tmp->inf);
tmp=tmp->pun;
}
Non funziona rimane comunque, questo è il problema che mi preme di più :muro:


:uh:

Louder Than Hell
09-12-2005, 16:46
Ottimo ho modificato un pò di cosette ed ora sembra funzionare tutto:

#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);
}

Grazie ;)