中易智联:求c语言一元多项式算法 哪位大哥帮帮忙

来源:百度文库 编辑:高考问答 时间:2024/05/05 16:51:15

#include<stdio.h>
#include<stdlib.h>

typedef
struct term
{
short expn; /*幂次*/
double coef; /*系数*/
struct term* next;
}
Term;

/*为了说明问题以下仅演示两个固定多项式
f(x)=3x^3-2x^2+x-1.5
g(x)=4x^4-3x^3+x+0.5
的加法与减法
*/
int main()
{
Term* create(int,double[]);
Term* chains(Term*,Term*,char);
void output(Term*);
void Free(Term*);
double fx[]={ 3,-2,1,-1.5};
double gx[]={4,-3,0,1, 0.5};
Term *hf,*hg,*hsum,*hdif;

/*首先为f(x),g(x)建立链表*/
hf=create(3,fx);
hg=create(4,gx);

/*调用多项式"加法"*/
hsum=chains(hf,hg,'+');
/*遍历hsum输出"和式"*/
output(hsum);
free(hsum);

/*调用多项式"减法"*/
hdif=chains(hf,hg,'-');
/*遍历hdif输出"差式"*/
output(hdif);
free(hdif);

return 0;
}

Term *create(int expmax,double f[])
{
int i;
Term *p,*q,*head=NULL;
for(i=0;i<=expmax;i++)
if(f[i]!=0.0)
{ p=(Term*)malloc(sizeof(Term));
p->coef=f[i];
p->expn=expmax-i;
if(head==NULL)head=p;
else q->next=p;
q=p;
}
q->next=NULL;
return head;
}

/*两链表pb,pg合并。合并原则:运算符op*/
Term *chains(Term*pb,Term*pg,char op)
{
Term *head=NULL,*p;
int i,expmax=0;
if(pb==NULL && pg==NULL)
return head;
if(pb!=NULL)expmax=pb->expn;
if(pg!=NULL&&expmax<pg->expn)expmax=pg->expn;
p=head=(Term*)malloc((expmax+1)*sizeof(Term));
/*构造总表(置空)*/
for(i=0;i<expmax;i++,p++)
{
p->expn=expmax-i;
p->coef=0.0;
p->next=p+1;
}
p->expn=0;
p->coef=0.0;
p->next=NULL;

/*将pb填入总表*/
p=head;
while(pb!=NULL)
{
while(p->expn>pb->expn)p=p->next;
p->coef=pb->coef;
pb=pb->next;
}

/*从总表加上或减去pg*/
p=head;
while(pg!=NULL)
{
while(p->expn>pg->expn)p=p->next;
if(op=='+')
p->coef+=pg->coef;
else if(op=='-')
p->coef-=pg->coef;
if(p->coef==0.0)
{ if(p==head)head=p->next;
else(p-1)->next=p->next;
/*free(p);删零系数结点*/
}
pg=pg->next;
}
return head;
}

void output(Term* head)
{ Term *p =head;
while(p!=NULL)
{
if(p->coef==+1 && p->expn)printf("+");
else if(p->coef==-1 && p->expn)printf("-");
else if(p==head)printf( "%.2lf",p->coef);
else printf("%+.2lf",p->coef);
if(p->expn==1)printf("x");
if(p->expn>=2)printf("x^%d",p->expn);
p=p->next;
}
printf("\n");
}