在另一个函数

时间:2016-05-29 00:52:13

标签: c

这段代码用于对多项式(add,sub,mul,div)进行一些操作,一切都在除法之外。

看起来当我在div函数中调用add函数时,由于某种原因崩溃了,但我不明白为什么。

这是整个代码,我使用列表来存储多项式

此行中名为“dividir_polinomios”的函数崩溃:

p_aaux = sumar_polinomios(p_aaux,p_sumaaux);

我不知道为什么它会崩溃,如果我在Main中调用相同的函数,使用相同的多项式,它可以工作,我在这里度过了一段糟糕的时间,因为我不习惯用C编程。

这是我使用的结构:

struct poli{

    float cons;
    unsigned char exp;
    struct poli *sig;

};

这是添加功能:

struct poli *sumar_polinomios(struct poli* p_a, struct poli *p_b){

    struct poli *res=NULL;
    struct poli *aux=NULL;
    struct poli *aux_a,*aux_b;
    aux_a=p_a;
    aux_b=p_b;
    while(aux_a || aux_b){
        aux=(struct poli*)malloc(sizeof(struct poli));
        if(aux_a->exp == aux_b->exp){
            aux->cons=aux_a->cons+aux_b->cons;
            aux->exp=aux_a->exp;
            aux->sig=NULL;
            res=crear_lista(res,aux);
            aux_a=aux_a->sig;
            aux_b=aux_b->sig;
        }
        else if(aux_a->exp > aux_b->exp){
            aux->cons=aux_a->cons;
            aux->exp=aux_a->exp;
            aux->sig=NULL;
            res=crear_lista(res,aux);
            aux_a=aux_a->sig;
        }
        else if(aux_a->exp < aux_b->exp){
            aux->cons=aux_b->cons;
            aux->exp=aux_b->exp;
            aux->sig=NULL;
            res=crear_lista(res,aux);
            aux_b=aux_b->sig;
        }
    }

    return res;

};

这是div函数:

void dividir_polinomios(struct poli *p_a, struct poli *p_b){

    struct poli *p_aaux=p_a;
    struct poli *p_baux=p_b;
    struct poli *aux;
    struct poli *cuociente=NULL;
    struct poli *p_sumaaux=NULL;
    struct poli *p_ressuma;
    while(1){

        //CONDICION PARA ROMPER WHILE AQUI//

        //Termino del cuociente
        aux = (struct poli*)malloc(sizeof(struct poli));
        aux->cons = p_aaux->cons/p_baux->cons;
        aux->exp = p_aaux->exp - p_baux->exp;
        aux->sig=NULL;

        cuociente=crear_lista(cuociente,aux);

        //printf("TEST: constante: %.2f\nexponente: %d",aux->cons,aux->exp);

        //Multiplicar termino por p_baux
        p_sumaaux=multiplicar_polinomios(p_baux,aux);

        //Invertir signo para realizar la suma
        p_sumaaux=cambiar_signo(p_sumaaux);

        printf("polinomio a:\n");
        mostrar_lista(p_aaux);
        printf("\npolinomio p_summaux:\n");
        mostrar_lista(p_sumaaux);
        //Sumar p_aaux + p_summaux

        printf("\n\nAhora exploto");
        p_aaux = sumar_polinomios(p_aaux,p_sumaaux); //<--THIS CRASH


        //Se quita el primer elemento
        p_aaux=p_aaux->sig;

        mostrar_lista(p_aaux);

   }

};

这是我用来创建列表的函数

struct poli *crear_lista(struct poli *lista,struct poli *nodo){
    struct poli *aux;
    if(!lista){
        lista=nodo;
    }
    else{
        aux=lista;

        while(aux->sig!=NULL){
            aux=aux->sig;
        }
        aux->sig=nodo;
    }
    return lista;
}

基本上,如果我使用此输入: (我实际上不存储“x”,只存储常量和exps。)

Poly_a = -20x ^ 5 + 37x ^ 3 -8x ^ 2 - 15x

Poly_b = 4x ^ 2-5

它应该在“cuociente”中存储以下结果:

-5X ^ 3 + 3×-2

但是,在“dividir_polinomios”内部调用“sumar_polinomnios”时,代码会崩溃。

修改

我设法修复了问题,问题出现在“sumar_polinomios”中,那是因为aux_b列表比aux_a列表更快地达到NULL值,所以当aux_b列表为空时我做了一些比较,如

aux_a->exp == aux_b->exp

因为aux_b为空而崩溃,所以我这样做了。

struct poli *sumar_polinomios(struct poli** p_a, struct poli **p_b){

    struct poli *res=NULL;
    struct poli *aux=NULL;
    struct poli *aux_a,*aux_b;
    aux_a=(*p_a);
    aux_b=(*p_b);

    while(aux_a || aux_b){
        aux=(struct poli*)malloc(sizeof(struct poli));
        //printf("\nestoy aqui\n");
        //printf("\nexp_a:%d\texp_b:%d\n",aux_a->exp,aux_b->exp);
        if(aux_a && aux_b){
            if(aux_a->exp == aux_b->exp){
                //printf("exponentes iguales\n");
                aux->cons=aux_a->cons+aux_b->cons;
                aux->exp=aux_a->exp;
                aux->sig=NULL;

                crear_lista(&res,aux);
                aux_a=aux_a->sig;
                aux_b=aux_b->sig;
                //printf("fin exponentes iguales\n");

            }
            else if(aux_a->exp > aux_b->exp){
                //printf("exponenten a > exponente b");
                aux->cons=aux_a->cons;
                aux->exp=aux_a->exp;
                aux->sig=NULL;
                crear_lista(&res,aux);
                aux_a=aux_a->sig;
                //printf("fin exponenten a > exponente b");
            }
            else if(aux_a->exp < aux_b->exp){
                //printf("exponente a < exponente b");
                aux->cons=aux_b->cons;
                aux->exp=aux_b->exp;
                aux->sig=NULL;
                crear_lista(&res,aux);
                aux_b=aux_b->sig;
                //printf("fin exponente a < exponente b");
            }
        }
        else if(aux_a!=NULL){
            aux->cons=aux_a->cons;
            aux->exp=aux_a->exp;
            aux->sig=NULL;
            crear_lista(&res,aux);
            aux_a=aux_a->sig;

        }
        else{
            aux->cons=aux_b->cons;
            aux->exp=aux_b->exp;
            aux->sig=NULL;
            crear_lista(&res,aux);
            aux_b=aux_b->sig;

        }
    }

    return res;

}

现在我检查两个列表是否都不为NULL,如果其中一个为null,我只需将非空列表附加到结果列表中。

1 个答案:

答案 0 :(得分:2)

你有一个双重免费()错误。

在crear_lista中发生的事情是你从以前存在的列表中分配一个新头并嫁接一个旧尾部,并且monstr_lista中发生的事情是你释放整个列表。第二次发生这种情况时,堆会被破坏,因此malloc()最终会返回垃圾并导致崩溃。

解决方案:复制crear_lista中的nodo列表。