/*********************************************************
TD d'Algorithmique IN202
ENSTA
Polynomes creux
Guillaume Poupard
*********************************************************/
#include <stdio.h>
#include <stdlib.h> /*contient notamment "malloc"*/
struct monome{
int degre;
double coeff;
struct monome *suiv;
};
typedef struct monome *polynome;
polynome cons(polynome P, int d, double c)
{
polynome nouv;
nouv=(polynome) malloc(sizeof(struct monome));
nouv->degre=d;
nouv->coeff=c;
nouv->suiv=P;
return nouv;
}
polynome copiepoly(polynome P)
{
if (P==NULL)
return NULL;
else
return cons(copiepoly(P->suiv),P->degre,P->coeff);
}
void freepoly(polynome *P)
{
polynome T;
if (*P!=NULL)
{
T=*P;
freepoly(&((*P)->suiv));
free(T);
}
*P=NULL;
}
void imprime(polynome P)
{
if (P==NULL)
printf("\n");
else
{
if (P->degre==0)
printf("%.2f",P->coeff);
else
if (P->degre==1)
printf("%.2f*x",P->coeff);
else
printf("%.2f*x^%d",P->coeff,P->degre);
if (P->suiv!=NULL)
if (P->suiv->coeff>=0)
printf("+");
imprime(P->suiv);
}
}
void multscal(polynome *P, double s)
{
if (s==0)
freepoly(P);
else
if (*P!=NULL)
{
(*P)->coeff*=s;
multscal(&((*P)->suiv),s);
}
}
void addmonome(polynome *P,int d, double c)
{
polynome T;
if (*P==NULL)
*P=cons(*P,d,c);
else
if ((*P)->degre>d)
*P=cons(*P,d,c);
else
if ((*P)->degre==d)
if (c+(*P)->coeff==0)
{
T=*P;
*P=(*P)->suiv;
free(T);
}
else
(*P)->coeff+=c;
else
addmonome(&((*P)->suiv),d,c);
}
void multmonome(polynome *P, int d, double c)
{
if (c==0)
freepoly(P);
else
if (*P!=NULL)
{
(*P)->coeff*=c;
(*P)->degre+=d;
multmonome(&((*P)->suiv),d,c);
}
}
void addpoly(polynome P1, polynome *P2)
{
if (P1!=NULL)
{
addmonome(P2,P1->degre,P1->coeff);
addpoly(P1->suiv,P2);
}
}
polynome sommepoly(polynome P1, polynome P2)
{
polynome P;
P=copiepoly(P2);
addpoly(P1,&P);
return P;
}
polynome multpoly(polynome P1, polynome P2)
{
polynome P,T;
P=NULL;
while (P1!=NULL)
{
T=copiepoly(P2);
multmonome(&T,P1->degre,P1->coeff);
addpoly(T,&P);
freepoly(&T);
P1=P1->suiv;
}
return P;
}
int main(int argc, char * argv[])
{
polynome P1,P2;
P1=NULL;
addmonome(&P1,2,3);
addmonome(&P1,1,-2);
addmonome(&P1,0,9);
addmonome(&P1,2,-1);
addmonome(&P1,12,3.14);
imprime(P1);
imprime(copiepoly(P1));
multscal(&P1,2.5);
imprime(P1);
P2=NULL;
addmonome(&P2,2,1);
addmonome(&P2,4,-8);
addmonome(&P2,0,1);
imprime(P2);
multmonome(&P2,2,3);
imprime(P2);
imprime(sommepoly(P1,P2));
imprime(multpoly(P1,P2));
exit(0);
}
syntax highlighted by Code2HTML, v. 0.9.1