elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)  (Leído 3,953 veces)
rocky11

Desconectado Desconectado

Mensajes: 2



Ver Perfil
Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
« 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.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
« Respuesta #1 en: 21 Junio 2014, 16:44 pm »

Estás pasando el polinomio todo con punteros. Va todo por referencia. Por eso se modifica.


En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)
« Respuesta #2 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.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines