Lista * somar(Lista *operando1, Lista *operando2) //funcionando perfeitamente
{
	int i;
	int valor = 0;
	int tam1 = tamanho(operando1);
	int tam2 = tamanho(operando2);
	Lista *resultadoSoma = criar();

    // caso os operandos sejam de tamanhos distintos, completa-se com zeros no inicio.
	if(tam1 > tam2){
        for(i = 0; i < tam1-tam2; i++)
            inserir_primeiro(operando2, 0);
	}
    // caso os operandos sejam de tamanhos distintos, completa-se com zeros no inicio.
	if(tam2 > tam1){
        for(i = 0; i < tam2-tam1; i++)
            inserir_primeiro(operando1, 0);
    }

    // soma do ultimo algarismo até o primeiro
    // colocando as unidades no resultado e somando a dezena na proxima soma.
	tam1 = tamanho(operando1);

	while(tam1 > 0){
	    valor = ler_pos(operando1, tam1-1) + ler_pos(operando2, tam1-1) + valor/10 ;
	    inserir_primeiro(resultadoSoma, valor%10);
        tam1--;
	}

    // caso sobre uma dezena da soma do primeiro algarismo, ela é adicionada no inicio do numero.
	if(valor/10 > 0)
        inserir_primeiro(resultadoSoma, valor/10);
    return resultadoSoma;
}
Lista * listaXnum(Lista * l, int n) // funcionando perfeitamente
{
	Lista * resultadoMult = criar();
	int valor = 0; // resultado da multiplicação de 'n' por um valor da lista
	int tam;

    // multiplica 'n' por toda a lista 'l'
	for(tam = tamanho(l); tam > 0; tam--)
    {
		valor = n*ler_pos(l, tam-1) + valor/10;     //valor é um numero de dois digitos
		inserir_primeiro(resultadoMult, valor%10);  // insere a unidade no final
	}

	// ao terminar a multiplicacao, insere o "vai um", que é a dezena, no inicio do numero;
	if(valor/10 > 0)
		inserir_primeiro(resultadoMult, valor/10);

	return resultadoMult;
}
Lista * listaXlista(Lista *operando1, Lista *operando2) // funcionando perfeitamente
{
    int tam2 = tamanho(operando2);
    int i,j;
    Lista *resultado1 = criar();
    Lista *resultado2;
    Lista *lixo;

    for(j = 0; tam2 > 0; j++, tam2--)
    {
        resultado2 = listaXnum(operando1, ler_pos(operando2, tam2-1));
        for(i = 0; i<j ;i++)
        {
            inserir_ultimo(resultado2, 0);
        }
        // como o resultado1 sempre vai pegar um valor de soma e vai perder o caminho para a lista original
        // a variavel "lixo" sempre pega os endereços perdidos e destrói.
        lixo = resultado1;
        resultado1 = somar(resultado1, resultado2);
        destruir(lixo);
    }

    return resultado1;
}
Exemple #4
0
//EDR
void ler_pos (ArvBin* arv){
	if (arv->valor == NULL) return;
	ler_pos(arv->esq);
	ler_pos(arv->dir);
	printf("%d ", *arv->valor);
}