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
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