Luthien 0 Denunciar post Postado Outubro 23, 2014 Tenho 2 pilhas com valores definidos: pilha1: 592 e pilha2: 3784, tenho q somar as duas pilhas, empilhar em uma terceira pilha e imprimir. Tentei fazer de um jeito mas n qr dar certo e tenho a impressão q tem uma maneira mt mais facil de se fazer. o programa para de responder qnd executo #include <stdio.h> typedef struct { int uni; int dez; int cent; int mil; int soma; } TipoItem; typedef struct celula { TipoItem item; struct celula *prox; } Celula; typedef struct { Celula *base; Celula *topo; } Pilha; Pilha pilha; void FPV(Pilha *pilha) { pilha->topo=(Celula*)malloc(sizeof(Celula)); pilha->topo->prox=NULL; pilha->base=pilha->topo; } int Vazia(Pilha pilha) { if(pilha.base==pilha.topo) return 1; else return 0; } void Empilha(Pilha *pilha, TipoItem x) { Celula *aux; pilha->topo->item=x; aux=(Celula*)malloc(sizeof(Celula)); aux->prox=pilha->topo; pilha->topo=aux; } void Desempilha(Pilha *pilha, TipoItem *x) { if(!Vazia(*pilha)) { *x = pilha->topo->prox->item; Celula *aux; aux=pilha->topo; pilha->topo=aux->prox; free(aux); } } void Imprime(Pilha pilha) { Pilha *pilhaAux; FPV(&pilhaAux); TipoItem x; while(!Vazia(pilha)) { Desempilha(&pilha, &x); Empilha(&pilhaAux, x); } while(!Vazia(*pilhaAux)) { Desempilha(&pilhaAux, &x); printf("%d\n%s\n%s\n", x.mil, x.cent, x.dez, x.uni); Empilha(&pilha, x); } } int main() { TipoItem u,d,c,m; int vai_um; Pilha *pilha1; Pilha *pilha2; Pilha *pilha3; FPV(&pilha1); FPV(&pilha2); FPV(&pilha3); pilha1->topo->item.uni = 2; pilha1->topo->item.dez = 9; pilha1->topo->item.cent = 5; pilha1->topo->item.mil = 0; pilha2->topo->item.uni = 4; pilha2->topo->item.dez = 8; pilha2->topo->item.cent = 7; pilha2->topo->item.mil = 3; Empilha(&pilha1,c); Empilha(&pilha1,d); Empilha(&pilha1,u); Empilha(&pilha2,m); Empilha(&pilha2,c); Empilha(&pilha2,d); Empilha(&pilha2,u); somaPilha(*pilha1,*pilha2,*pilha3); } void somaPilha(Pilha *pilha1,Pilha *pilha2,Pilha *pilha3) { int vai_um; while(!Vazia(*pilha1) && !Vazia(*pilha2)) { pilha3->topo->item.uni = pilha1->topo->item.uni + pilha2->topo->item.uni; if(pilha3->topo->item.uni > 9) vai_um = pilha3->topo->item.uni - (pilha3->topo->item.uni - 10); pilha3->topo->item.dez = pilha1->topo->item.dez + pilha2->topo->item.dez + vai_um; if(pilha3->topo->item.dez > 9) vai_um = pilha3->topo->item.dez - (pilha3->topo->item.dez - 10); pilha3->topo->item.cent = pilha1->topo->item.cent + pilha2->topo->item.cent + vai_um; if(pilha3->topo->item.cent > 9) vai_um = pilha3->topo->item.cent - (pilha3->topo->item.cent - 10); pilha3->topo->item.mil = pilha1->topo->item.mil + pilha2->topo->item.mil + vai_um; } Imprime(*pilha3); } o meu vai_um tbm ta errado, mas n consegui pensar em outra maneira de fazer Compartilhar este post Link para o post Compartilhar em outros sites
LazaroBinda 3 Denunciar post Postado Outubro 25, 2014 Existe alguns pontos que você não está inicializando os ponteiros corretamente. Não sei se está somando como você quer, mas vê se pode te ajudar: #include <stdio.h> #include <new> typedef struct { int uni; int dez; int cent; int mil; int soma; } TipoItem; typedef struct celula { TipoItem item; struct celula *prox; } Celula; typedef struct { Celula *base; Celula *topo; } Pilha; void somaPilha(Pilha *pilha1, Pilha *pilha2, Pilha *pilha3); //void FPV(Pilha *pilha) //{ // pilha->topo = (Celula*) malloc(sizeof(Celula)); // pilha->topo->prox = NULL; // pilha->base = pilha->topo; //} int Vazia(Pilha pilha) { if (pilha.topo == NULL) return 1; else return 0; } void Empilha(Pilha *pilha, TipoItem x) { Celula *aux; aux = (Celula*) malloc(sizeof(Celula)); aux->item = x; aux->prox = pilha->topo; if (pilha->topo == NULL) pilha->base = aux; pilha->topo = aux; } void Desempilha(Pilha *pilha, TipoItem *x) { if (!Vazia(*pilha)) { *x = pilha->topo->item; Celula *aux; aux = pilha->topo; if (pilha->base == pilha->topo) pilha->topo = NULL; else pilha->topo = aux->prox; free(aux); } } void Imprime(Pilha pilha) { Pilha *pilhaAux = (Pilha*)malloc(sizeof(Pilha)); *pilhaAux = { NULL, NULL }; TipoItem x; while (!Vazia(pilha)) { Desempilha(&pilha, &x); Empilha(pilhaAux, x); } while (!Vazia(*pilhaAux)) { Desempilha(pilhaAux, &x); printf("%d\n%d\n%d\n%d\n\n", x.mil, x.cent, x.dez, x.uni); Empilha(&pilha, x); } free(pilhaAux); } int main() { TipoItem u = { 1, 1, 1, 1 }, d = { 2, 2, 2, 2 }, c = { 3, 3, 3, 3 }, m = { 4, 4, 4, 4 }; //só pra teste //int vai_um; Pilha *pilha1 = (Pilha*)malloc(sizeof(Pilha)); Pilha *pilha2 = (Pilha*)malloc(sizeof(Pilha)); Pilha *pilha3 = (Pilha*)malloc(sizeof(Pilha)); *pilha1 = { NULL, NULL }; *pilha2 = { NULL, NULL }; *pilha3 = { NULL, NULL }; Empilha(pilha1, { 2, 9, 5, 0 }); Empilha(pilha2, { 4, 8, 7, 3 }); Empilha(pilha1, c); Empilha(pilha1, d); Empilha(pilha1, u); Empilha(pilha2, m); Empilha(pilha2, c); Empilha(pilha2, d); Empilha(pilha2, u); somaPilha(pilha1, pilha2, pilha3); free(pilha1); free(pilha2); free(pilha3); } void somaPilha(Pilha *pilha1, Pilha *pilha2, Pilha *pilha3) { TipoItem x = {}; do { int vai_um = 0; Empilha(pilha3, { 0 }); pilha3->topo->item.uni += pilha1->topo->item.uni + pilha2->topo->item.uni; if (pilha3->topo->item.uni > 9) vai_um = pilha3->topo->item.uni - (pilha3->topo->item.uni - 10); pilha3->topo->item.dez += pilha1->topo->item.dez + pilha2->topo->item.dez + vai_um; if (pilha3->topo->item.dez > 9) vai_um = pilha3->topo->item.dez - (pilha3->topo->item.dez - 10); pilha3->topo->item.cent += pilha1->topo->item.cent + pilha2->topo->item.cent + vai_um; if (pilha3->topo->item.cent > 9) vai_um = pilha3->topo->item.cent - (pilha3->topo->item.cent - 10); pilha3->topo->item.mil += pilha1->topo->item.mil + pilha2->topo->item.mil + vai_um; Desempilha(pilha1, &x); Desempilha(pilha2, &x); } while (!Vazia(*pilha1) && !Vazia(*pilha2)); Imprime(*pilha3); } Compartilhar este post Link para o post Compartilhar em outros sites