Suma Polinomio con monomio C (TDA, estructura enlazada e inmutable)

Iniciado por rocky11, 21 Junio 2014, 13:45 PM

0 Miembros y 1 Visitante están viendo este tema.

rocky11

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


typedef struct Celda {
int grado;
float coef;
struct Celda * sig;
} CeldaRep;

typedef CeldaRep * CeldaAp;

typedef void * Polinomio;

Polinomio SumaMonomio(Polinomio p, int grado, float coeficiente) {
CeldaAp Pol = p;
CeldaAp c = p;       //copia de p para recorrer los bucles;
while((c->sig!=NULL) && (c->sig->grado > grado)) {
Pol->coef = c->sig->coef;
Pol->grado = c->sig->grado;
//Pol->sig->sig = c->sig->sig;
c = c->sig;
Pol=Pol->sig;
//printf("%1.1fx^%i \n",Pol->sig->coef,Pol->sig->grado);
}

if ((c->sig!=NULL)&&(c->sig->grado==grado)) {
Pol->sig->coef = c->sig->coef + coeficiente;

if (Pol->sig->coef == 0) {
CeldaAp aux = Pol->sig;
Pol->sig = Pol->sig->sig;
free(aux);
}
}
else {

       //crear los if por si no hay memoria
CeldaAp aux = malloc(sizeof(CeldaRep));
aux->coef = coeficiente;
aux->grado = grado;
aux->sig = Pol->sig;
Pol->sig = aux;
}
return Pol;
}


Alguien me podría ayudar  :D

Gracias, saludos.

ivancea96

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

Arkangel_0x7C5

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 (cpp) [Seleccionar]

Pol->coef = c->sig->coef;
Pol->grado = c->sig->grado;

No lo he probado, pero con estas modificaciones tiene que funcionar

typedef struct Celda {
    int grado;
    float coef;
    struct Celda * sig;
} CeldaRep;
     
typedef CeldaRep * CeldaAp;
     
typedef void * Polinomio;
     
Polinomio SumaMonomio(Polinomio p, int grado, float coeficiente) {
    CeldaAp Pol = p;
    while((c->sig!=NULL) && (c->sig->grado > grado)) {
        Pol=Pol->sig;//Avanzas mientras no encuentres el monomio de rado adecuado
    }
    //Aqui ya solo tienes que sumar el polinomio en el sitio adecado
    if ((Pol->sig!=NULL)&&(Pol->sig->grado==grado)) {
        Pol->sig->coef += coeficiente;
        if (Pol->sig->coef == 0) {
            CeldaAp aux = Pol->sig;
            Pol->sig = Pol->sig->sig;
            free(aux);
        }
    }else {
        CeldaAp aux = malloc(sizeof(CeldaRep));
        aux->coef = coeficiente;
        aux->grado = grado;
        aux->sig = Pol->sig;
        Pol->sig = aux;
    }
    return Pol;
}