elseif(a.expn==b.expn)return0;
elsereturn1;
}
intLocateElem(LinkList*p,elemtypee,LinkList*q){
if(*p==NULL)returnOVERFLOW;
*q=(*p)->next;
if((*q)==NULL){
*q=*p;
returnERROR;
}
while((*q)!
=NULL){
if(cmp(e,(*q)->data)==0)break;
else*q=(*q)->next;
}
if((*q)!
=NULL)returnTURE;
if((*q)==NULL){
returnFALSE;
}
}
intMakeNode(LinkList*s,elemtypee){
if(!
(*s))returnOVERFLOW;
(*s)->data=e;
(*s)->next=NULL;
returnOK;
}
voidInsFirst(LinkList*q,LinkList*s){
(*s)->next=(*q)->next;
(*q)->next=*s;
}
intDelFirst(LinkList*q,LinkList*s){
LinkListp;
p=*s;
(*q)->next=p->next;
returnOK;
}
voidFreeNode(LinkList*p){
LinkListq;
q=*p;
free(q);
}
LinkListNextPos(LinkList*p,LinkList*q){
return(*q)->next;
}
voidSetCurElem(polynomail*p,floatm){
((*p)->data).coef=m;
}
intListEmpty(LinkListp){
if(p->next==NULL)returnTURE;
if(p->next!
=NULL)returnFALSE;
}
voidAppend(LinkList*p,LinkList*s){
LinkListq;
q=*p;
while(q->next!
=NULL)q=q->next;
q->next=*s;
}
voidSortPolyn(polynomail*p){
polynomailq,s,t,m,n,x,y,x1,x2;
q=*p;
Initlist(&m);
m->data.coef=0.0;
m->data.expn=-1;
n=m;
s=q;
y=s->next;
t=y->next;
x=q->next;
x1=s;
x2=t;
while(x2!
=NULL){
while(t!
=NULL){
if(cmp(x->data,y->data)<=0){
s=s->next;
y=y->next;
t=t->next;
}
else{
x=y;
x1=s;
x2=t;
}
}
if(cmp(x->data,y->data)>0){
x=y;
x1=s;
x2=t;
}
x1->next=x2;
n->next=x;
x->next=NULL;
n=n->next;
x1=q;
x=q->next;
x2=x->next;
s=x1;
y=x;
t=x2;
}
n->next=x;
x->next=NULL;
q->next=NULL;
free(q);
*p=m;
}
voidCreatePolyn(polynomail*p,intm){
polynomailh,q[100],s[100],x;
inti;
elemtypee;
elemtypet[100];
h=*p;
e.coef=0.0;
e.expn=-1;
h->data=e;
h->next=NULL;
q[0]=h;
Initlist(&x);
for(i=0;iInitlist(&s[i]);
printf("pleaseinputthecoef:
theexpn:
\n");
scanf("%f%d",&t[i].coef,&t[i].expn);
if(!
LocateElem(p,t[i],&x)){
if(MakeNode(&s[i],t[i]))InsFirst(&q[i],&s[i]);
q[i+1]=s[i];
}
elseq[i+1]=q[i];
}
SortPolyn(p);
}
voidPrintPolyn(polynomailq){
q=q->next;
if((q->data).coef>0.0&&(q->data).expn!
=0)printf("%.4f*x^(%d)",(q->data).coef,(q->data).expn);
elseif((q->data).expn==0)printf("%.4f",(q->data).coef);
elseprintf("%.4f*x^(%d)",(q->data).coef,(q->data).expn);
q=q->next;
while(q!
=NULL){
if((q->data).coef>0.0&&(q->data).expn!
=0)printf("+%.4f*x^(%d)",(q->data).coef,(q->data).expn);
elseif((q->data).expn==0&&(q->data).coef>0.0)printf("+%.4f",(q->data).coef);
elseif((q->data).expn==0&&(q->data).coef<0.0)printf("%.4f",(q->data).coef);
elseprintf("%.4f*x^(%d)",(q->data).coef,(q->data).expn);
q=q->next;
}
printf("\n");
}
voidAddPolyn(polynomail*pa,polynomail*pb){
polynomailha,hb,qa,qb;
ha=*pa;
hb=*pb;
qa=NextPos(pa,&ha);
qb=NextPos(pb,&hb);
elemtypea,b;
floatsum;
while(qa&&qb){
a=qa->data;
b=qb->data;
switch(cmp(a,b)){
case-1:
ha=qa;
qa=NextPos(pa,&qa);
break;
case0:
sum=a.coef+b.coef;
if(sum!
=0.0){
SetCurElem(&qa,sum);
ha=qa;
}
else{
DelFirst(&ha,&qa);
FreeNode(&qa);
}
DelFirst(&hb,&qb);
FreeNode(&qb);
qb=NextPos(pb,&hb);
qa=NextPos(pa,&ha);
break;
case1:
DelFirst(&hb,&qb);
InsFirst(&ha,&qb);
qb=NextPos(pb,&hb);
ha=NextPos(pa,&ha);
break;
}
}
if(!
ListEmpty(*pb))Append(pa,&qb);
FreeNode(&hb);
}
voidSubStractPolyn(polynomail*pa,polynomail*pb){
polynomailha,hb,qa,qb;
ha=*pa;
hb=*pb;
qa=NextPos(pa,&ha);
qb=NextPos(pb,&hb);
elemtypea,b;
floatsum;
while(qb!
=NULL){
qb->data.coef=-qb->data.coef;
qb=qb->next;
}
qb=NextPos(pb,&hb);
while(qa&&qb){
a=qa->data;
b=qb->data;
switch(cmp(a,b)){
case-1:
ha=qa;
qa=NextPos(pa,&qa);
break;
case0:
sum=a.coef+b.coef;
if(sum!
=0.0){
SetCurElem(&qa,sum);
ha=qa;
}
else{
DelFirst(&ha,&qa);
FreeNode(&qa);
}
DelFirst(&hb,&qb);
FreeNode(&qb);
qb=NextPos(pb,&hb);
qa=NextPos(pa,&ha);
break;
case1:
DelFirst(&hb,&qb);
InsFirst(&ha,&qb);
qb=NextPos(pb,&hb);
ha=NextPos(pa,&ha);
break;
}
}
if(!
ListEmpty(*pb))Append(pa,&qb);
FreeNode(&hb);
}
doubleEvaluatePolyn(polynomailp,floatx){
polynomailq;
doubley=0.0;
q=p->next;
while(q!
=NULL){
y+=(q->data.coef)*pow(x,q->data.expn);
q=q->next;
}
returny;
}
voidDestroyPolyn(polynomail*p){
free(*p);
}
voidClearPolyn(polynomail*p){
polynomailq;
q=*p;
while(*p!
=NULL){
*p=(*p)->next;
free(q);
q=*p;
}
}
intInsertPolyn(polynomail*q,polynomail*s){
while((*q)->next!
=NULL){
switch(cmp((*q)->next->data,(*s)->data)){
case-1:
*q=(*q)->next;
break;
case0:
(*q)->data.coef+=(*s)->data.coef;
returnOK;
case1:
(*s)->next=(*q)->next;
(*q)->next=*s;
returnOK;
}
(*q)->next=*s;
returnOK;
}
}
intDeletePolyn(polynomail*q,elemtypex){
polynomailt;
while((*q)->next!
=NULL){
if(((*q)->next->data.coef==x.coef)&&((*q)->next->data.expn==x.expn)){
t=(*q)->next;
(*q)->next=t->next;
free(t);
returnOK;
}
else*q=(*q)->next;
}
if((*q)->next==NULL)returnFALSE;
}
intChangePolyn(polynomail*p,elemtypex,elemtypey){
polynomails;
MakeNode(&s,y);
DeletePolyn(p,x);
InsertPolyn(p,&s);
returnOK;
}
voidDifferentialPolyn(polynomail*p,intn){
polynomailq,s;
inti;
q=*p;
s=q->next;
for(i=0;iwhile(s!
=NULL){
if(s->data.expn!
=0){
s->data.coef*=s->data.expn;
s->data.expn--;
q=q->next;
s=q->next;
}
else{
q->next=s->next;
s=q->next;
}
}
q=*p;
s=q->next;
}
}
voidMultiplyPolyn(polynomail*pa,polynomail*pb){
intn=0,i;
polynomails,t,q[100];
s=*pb;
while(s->next!
=NULL){
n++;
s=s->next;
}
s=(*pb)->next;
for(i=0;iq[i]=*pa;
t=q[i]->next;
while(t!
=NULL){
t->data.coef*=s->data.coef;
t->data.expn+=s->data.expn;
t=t->next;
}
s=s->next;
}
for(i=1;iAddPolyn(&q[0],&q[i]);
}
*pa=q[0];
}
voidIntegratePolyn(polynomail*p){
polynomailq,s;
q=*p;
s=q->next;
while(s!
=NULL){
s->data.coef/=s->data.expn+1;
s->data.expn++;
q=q->next;
s=q->next;
}
}
doubleDefiniteIntegralPolyn(polynomail*p,floatx,floaty){
IntegratePolyn(p);
doublef;
f=EvaluatePolyn(*p,y)-EvaluatePolyn(*p,x);
returnf;
}
voidInvolutionPolyn(polynomail*p,intn){
polynomailq[100];
inti;
for(i=0;ifor(i=1;i*p=q[0];
}
voidDivisionPolyn(polynomail*p,polynomail*q){
polynomails,t,x,q1,q2,rest;
intn,m;
s=*p;
t=*q;
while(s->next!
=NULL)s=s->next;
while(t->next!
=NULL)t=t->next;
m=s->data.expn;
n=t->data.expn;
Initlist(&x);
x->data.coef=0.0;
x->data.expn=-1;
Initlist(&rest);
rest->data.coef=0.0;
rest->data.expn=-1;
while(m!
=0&&m>=n){
Initlist(&q1);
q1->data.coef=0.0;
q1->data.expn=-1;
AddPolyn(&q1,q);
x->data.coef=s->data.coef/(t->data.coef);
x->data.expn=s->data.expn-t->data.expn;
InsFirst(&rest,&x);
q2=(*q)->next;
while(q2!
=NULL){
q2->data.coef*=x->data.coef;
q2->data.expn+=x->data.expn;
q2=q2->next;
}
SubStractPolyn(p,&q1);
DestroyPolyn(&q1);
s=*p;
t=*q;
while(s->next!
=NULL)s=s->next;
while(t->next!
=NULL)t=t->next;
m=s->data.expn;
n=t->data.expn;
}
q1=*p;
q2=*q;
*p=rest;
*q=q1;
DestroyPolyn(&q2);
}
voidmain(){
polynomailp,q,p1,q1;
intm,n,t;
Initlist(&p);
Initlist(&q);
Initlist(&p1);
Initlist(&q1);
printf("pleaseinputthelengthofpolynomail:
\n");
scanf("%d",&m);
CreatePolyn(&p,m);
CreatePolyn(&q,m);
PrintPolyn(p);
PrintPolyn(q);
AddPolyn(&p,&q);
PrintPolyn(p);
printf("pleaseinputn=\n");
scanf("%d",&n);
DifferentialPolyn(&p,n);
PrintPolyn(p);
IntegratePolyn(&p);
PrintPolyn(p);
printf("pleaseinputthelengthofpolynomail:
\n");
scanf("%d",&t);
CreatePolyn(&p1,t);
CreatePolyn(&q1,t);
PrintPolyn(p1);
PrintPolyn(q1);
DivisionPolyn(&p1,&q1);
PrintPolyn(p1);
PrintPolyn(q1);
printf("%lf\n",EvaluatePolyn(p,3.0));
}