Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: rocky11 en 21 Junio 2014, 13:45 pm



Título: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
Publicado por: rocky11 en 21 Junio 2014, 13:45 pm
Buenas estoy haciendo una función que sume un monomio a un polinomio, la función es inmutable y usa una estructura enlazada.

Mi problema es que al hacer la suma (parece que la hace bien) también se modifica el valor del PolinomioP1 y eso no tiene que pasar ya que después tengo que hacer mas operaciones con el polinomio.

Este es el resustado de la ejecucion
PolinomioP1: +2.0x^4 +1.0x^3 +1.0x^2 -5.0x^0
Monomio: 11x^3
SumaMonomio: +2.0x^4 +12.0x^3 +1.0x^2 -5.0x^0

PolinomioP1: +2.0x^4 +12.0x^3 +1.0x^2 -5.0x^0

Código
  1. typedef struct Celda {
  2. int grado;
  3. float coef;
  4. struct Celda * sig;
  5. } CeldaRep;
  6.  
  7. typedef CeldaRep * CeldaAp;
  8.  
  9. typedef void * Polinomio;
  10.  
  11. Polinomio SumaMonomio(Polinomio p, int grado, float coeficiente) {
  12. CeldaAp Pol = p;
  13. CeldaAp c = p;       //copia de p para recorrer los bucles;
  14. while((c->sig!=NULL) && (c->sig->grado > grado)) {
  15. Pol->coef = c->sig->coef;
  16. Pol->grado = c->sig->grado;
  17. //Pol->sig->sig = c->sig->sig;
  18. c = c->sig;
  19. Pol=Pol->sig;
  20. //printf("%1.1fx^%i \n",Pol->sig->coef,Pol->sig->grado);
  21. }
  22.  
  23. if ((c->sig!=NULL)&&(c->sig->grado==grado)) {
  24. Pol->sig->coef = c->sig->coef + coeficiente;
  25.  
  26. if (Pol->sig->coef == 0) {
  27. CeldaAp aux = Pol->sig;
  28. Pol->sig = Pol->sig->sig;
  29. free(aux);
  30. }
  31. }
  32. else {
  33.  
  34.        //crear los if por si no hay memoria
  35. CeldaAp aux = malloc(sizeof(CeldaRep));
  36. aux->coef = coeficiente;
  37. aux->grado = grado;
  38. aux->sig = Pol->sig;
  39. Pol->sig = aux;
  40. }
  41. return Pol;
  42. }

Alguien me podría ayudar  :D

Gracias, saludos.


Título: Re: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
Publicado por: ivancea96 en 21 Junio 2014, 16:44 pm
Estás pasando el polinomio todo con punteros. Va todo por referencia. Por eso se modifica.


Título: Re: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
Publicado por: Arkangel_0x7C5 en 22 Junio 2014, 13:26 pm
Hazlo sin usar El CeldaAp c, si te fijas es lo mismo que CeldaAp Pol. Y recuerda que en el bucle estas haciendo una busqueda. Por lo que no necesitas
Código
  1. Pol->coef = c->sig->coef;
  2. Pol->grado = c->sig->grado;
  3.  
No lo he probado, pero con estas modificaciones tiene que funcionar
Código
  1. typedef struct Celda {
  2.    int grado;
  3.    float coef;
  4.    struct Celda * sig;
  5. } CeldaRep;
  6.  
  7. typedef CeldaRep * CeldaAp;
  8.  
  9. typedef void * Polinomio;
  10.  
  11. Polinomio SumaMonomio(Polinomio p, int grado, float coeficiente) {
  12.    CeldaAp Pol = p;
  13.    while((c->sig!=NULL) && (c->sig->grado > grado)) {
  14.        Pol=Pol->sig;//Avanzas mientras no encuentres el monomio de rado adecuado
  15.    }
  16.    //Aqui ya solo tienes que sumar el polinomio en el sitio adecado
  17.    if ((Pol->sig!=NULL)&&(Pol->sig->grado==grado)) {
  18.        Pol->sig->coef += coeficiente;
  19.        if (Pol->sig->coef == 0) {
  20.            CeldaAp aux = Pol->sig;
  21.            Pol->sig = Pol->sig->sig;
  22.            free(aux);
  23.        }
  24.    }else {
  25.        CeldaAp aux = malloc(sizeof(CeldaRep));
  26.        aux->coef = coeficiente;
  27.        aux->grado = grado;
  28.        aux->sig = Pol->sig;
  29.        Pol->sig = aux;
  30.    }
  31.    return Pol;
  32. }
  33.  
  34.