PDA

View Full Version : [C] Inversione di una pila


xbubbax
14-03-2008, 13:57
Come mai mi da errore questo semplice programma per invertire una pila?

vi incollo anche una funzione che uso, la top

int Top(pilaPtr P){

if(P!=NULL){
return P->data;}else{
return NULL;}}

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

Ignorate P3 che mi serivrà dopo per ricostruire la pila originale

gugoXX
14-03-2008, 14:39
Non conosco l'implementazione di pila che hai, ma sei sicuro che la seguente sia corretta?


P=Pop(P);


Solitamente la Pop di una pila ritorna un elemento, non la pila.

xbubbax
14-03-2008, 14:57
ecco tutte le mie funzioni

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

gugoXX
14-03-2008, 15:18
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.

xbubbax
14-03-2008, 18:34
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è

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







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

gugoXX
14-03-2008, 18:41
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.

xbubbax
14-03-2008, 19:00
ora funziona perfettamente

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

cionci
15-03-2008, 02:52
ora funziona perfettamente

A parte l'indentazione...