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; }
//EDR void ler_pos (ArvBin* arv){ if (arv->valor == NULL) return; ler_pos(arv->esq); ler_pos(arv->dir); printf("%d ", *arv->valor); }