Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

somar 2 pilhas

Recommended Posts

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.