#include<stdio.h>
#include<stdlib.h>
typedef struct polynode
{
double c;//系数
int e;//指数
struct polynode *next;//指针
} PNode,*Polyn;
#define CreatePNode(p) p=(PNode *)malloc(sizeof(PNode));
#define DeletePNode(p) free((void *)p);
Polyn input1()
{ FILE *fp;
Polyn h,p,last;double x;int y;
CreatePNode(h);//产生头结点
last=h;
if((fp=fopen("in1.txt","r"))==NULL)
{
printf("can not open the file1\n");
exit(0);
}
while(1)
{ fscanf(fp,"%lf %d",&x,&y);
if(x==0) break;
CreatePNode(p);
p->c=x;p->e=y;
last->next=p;last=p;
if(feof(fp))break;
}
last->next=NULL;
fclose(fp);
return h;
}
Polyn input2()
{ FILE *fp;
Polyn h,p,last;double x;int y;
CreatePNode(h);//产生头结点
last=h;
if((fp=fopen("in2.txt","r"))==NULL)
{
printf("can not open the file2\n");
exit(0);
}
while(1)
{ fscanf(fp,"%lf %d",&x,&y);
if(x==0) break;
CreatePNode(p);
p->c=x;p->e=y;
last->next=p;last=p;
if(feof(fp))break;
}
last->next=NULL;
fclose(fp);
return h;
}
void output(Polyn h)
{ FILE *fp;
if((fp=fopen("out.txt","w"))==NULL)
{
printf("can not open the file\n");
exit(0);
}
Polyn p=h->next;
while(p)
{
fprintf(fp,"%5.2f,%d\n",p->c,p->e);
// printf("%5.2f,%d\n",p->c,p->e);
p=p->next;
}
fclose(fp);
}
Polyn add(Polyn h1,Polyn h2)
{ Polyn p1,p2,p;
p1=h1->next;p2=h2->next;
Polyn h,p3;
CreatePNode(h);p3=h;
while(p1&&p2)
{
if(p1->e < p2->e){p=p1;p1=p1->next;}
else if(p2->e < p1->e){p=p2;p2=p2->next;}
else
{
p1->c+=p2->c;
if(p1->c==0)
{ p=p1;p1=p1->next;DeletePNode(p);
p=p2;p2=p2->next;DeletePNode(p);
continue;
}
p=p2;p2=p2->next;DeletePNode(p);
p=p1;p1=p1->next;
}
p3->next=p;p3=p;
}
if(p1) p3->next=p1;
else if(p2) p3->next=p2;
else p3->next=NULL;
h1->next=h2->next=NULL;
return h;
}
// 我的多项式乘法
Polyn mul(Polyn hp, Polyn hq)
{
Polyn hr, ht, p, q, pt;
CreatePNode(hr); hr->next = NULL;//R(x)=0;
CreatePNode(ht); ht->next = NULL;//T(x)=0;
q = hq->next;
while(q)//实现for(i=0; i<n; i++)
{
pt = ht;
p = hp->next;
while(p)
{
//以下实现T(x)=P(x)cixdi;
CreatePNode(pt->next);
pt = pt->next;
pt->c = p->c * q->c;
pt->e = p->e + q->e;
p = p->next;
}
pt->next = NULL;
q = q->next;
//以下实现R(x)=R(x)+T(x)
p = add(hr, ht);
DeletePNode(hr);
hr = p;
}
DeletePNode(ht);
return hr;
}
int main()
{
Polyn pa,pb,pc;
pa=input1(); //读入多项式1
pb=input2();//读入多项式2
pc=mul(pa,pb); //两个多项式相乘
output(pc); //输出积多项式
return 0;
}
评论0