|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Inversione di una pila
Come mai mi da errore questo semplice programma per invertire una pila?
vi incollo anche una funzione che uso, la top Codice HTML:
int Top(pilaPtr P){
if(P!=NULL){
return P->data;}else{
return NULL;}}
Codice HTML:
pilaPtr Inverti(pilaPtr P){
pilaPtr P2=NULL;
pilaPtr P3=NULL;
int e=0;
while((Empty(P))==0){
e=Top(P);
P2=Push(P2,e);
P3=Push(P3,e);
P=Pop(P);}
return P2;}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Non conosco l'implementazione di pila che hai, ma sei sicuro che la seguente sia corretta?
Solitamente la Pop di una pila ritorna un elemento, non la pila.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ecco tutte le mie funzioni
Codice HTML:
#include <stdio.h> #include <stdlib.h> struct nodo{ int data; struct nodo *next;}; typedef struct nodo nodo; typedef struct nodo *pilaPtr; int Empty(pilaPtr P){ if(P==NULL){ return 1;}else{ return 0;}} pilaPtr Push(pilaPtr P, int e){ pilaPtr temp=NULL; temp=(pilaPtr)malloc(sizeof(nodo)); if(temp){ temp->data=e; temp->next=P; P=temp; return P;}else{ printf("Memoria Esaurita\n");}} int Top(pilaPtr P){ if(P!=NULL){ return P->data;}else{ return NULL;}} pilaPtr Pop(pilaPtr P){ pilaPtr temp=NULL; if(!Empty(P)){ temp=P; P=temp->next; free(temp);}else{ printf("La Pila E' Gia' Vuota\n");}} void Stampa(pilaPtr P){ while(P!=NULL){ printf("%d\n", P->data); P=P->next;}} |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E' una brutta indentazione.
Comunque la POP non restitusice nulla, non dovrebbe neppure compilare. Penso che debba restituire temp ma io la pila la farei diversamente. Farei restituire l'intero alla POP, oppure NULL se la pila e' vuota. In questo modo potrei usare anche solo la funzione POP per eseguire l'esercizio. POPpo dalla vecchia e PUSHo nella nuova fino a quando ci sono valori, ovvero esco quando ottengo NULL.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Allora, ho corretto la mia Pop, avevo dimenticato di inserire Return P. Ho provato il programma e funziona, ovvero crea una pila con gli elementi in ordine inverso, però quando inserisco un secondo while per rimettere la pila con i suoi elementi nel suo ordine originario mi da errore, non capisco perchè
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include "funzioni_pile.h" pilaPtr Inverti(pilaPtr P){ pilaPtr P2=NULL; pilaPtr P3=NULL; int e=0; while((Empty(P))==0){ e=Top(P); P2=Push(P2,e); P3=Push(P3,e); P=Pop(P);} while((Empty(P2))==0){ e=Top(P2); P1=Push(P1,e); P2=Pop(P2);} return P3;} int main(void){ pilaPtr P1=NULL; pilaPtr P2=NULL; P1=Push(P1,1); P1=Push(P1,2); P1=Push(P1,3); printf("\n"); Stampa(P1); printf("\n"); P2=Inverti(P1); Stampa(P2); system("PAUSE");} Codice HTML:
#include <stdio.h> #include <stdlib.h> struct nodo{ int data; struct nodo *next;}; typedef struct nodo nodo; typedef struct nodo *pilaPtr; int Empty(pilaPtr P){ if(P==NULL){ return 1;}else{ return 0;}} pilaPtr Push(pilaPtr P, int e){ pilaPtr temp=NULL; temp=(pilaPtr)malloc(sizeof(nodo)); if(temp){ temp->data=e; temp->next=P; P=temp; return P;}else{ printf("Memoria Esaurita\n");}} int Top(pilaPtr P){ if(P!=NULL){ return P->data;}else{ return NULL;}} pilaPtr Pop(pilaPtr P){ pilaPtr temp=NULL; if(!Empty(P)){ temp=P; P=temp->next; free(temp); return P;}else{ printf("La Pila E' Gia' Vuota\n");}} void Stampa(pilaPtr P){ while(P!=NULL){ printf("%d\n", P->data); P=P->next;}} |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
CHe errore ti da?
Poi non capisco come faccia a compilare. La prima funzione fa uso di una variabile chiamata P1, che localmente non esiste... Ti consiglio di abilitare tutti gli Warning e di fermarti sempre, fino a che non sono risolti tutti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ora funziona perfettamente
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include "funzioni_pile.h" pilaPtr Inverti(pilaPtr P){ pilaPtr P2=NULL; pilaPtr P3=NULL; int e=0; while((Empty(P))==0){ e=Top(P); P2=Push(P2,e); P3=Push(P3,e); P=Pop(P);} while((Empty(P2))==0){ e=Top(P2); P=Push(P,e); P2=Pop(P2);} return P3;} int main(void){ pilaPtr P1=NULL; pilaPtr P2=NULL; P1=Push(P1,1); P1=Push(P1,2); P1=Push(P1,3); printf("\n"); Stampa(P1); printf("\n"); P2=Inverti(P1); Stampa(P2); system("PAUSE");} |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:25.




















