#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define NULL 0
//定义多项式结构体类型
typedef struct polynomial
{
int ceof;
int expn;
struct polynomial *next;
}polynomial;
//从文件中读取多项式
void PrintPolyn(FILE *fp)
{int ceof,expn,i;
fscanf(fp,"%d %d",&ceof,&expn);
printf("%dx^%d",ceof,expn);
for(i=0;i<4;i++)
{
if(!feof(fp))//判断文件是否读完
{
fscanf(fp,"%d%d",&ceof,&expn);
printf("+%dx^%d",ceof,expn);
}
}
}
//对比两个多项式的的指数
int Compare_expn(int a,int b)
{
if(a==b)
return 0;
else if(a<b)
return -1;
else
return 1;
}
//运用链表初始化多项式
polynomial *CreatPolyn(FILE *fp)
{ polynomial *head,*pre,*q;
head=(polynomial*)malloc(sizeof(polynomial));
head->next=NULL;
pre=head;
while(!feof(fp))
{
q=(polynomial*)malloc(sizeof(polynomial));
fscanf(fp,"%d%d",&q->ceof,&q->expn);
pre->next=q;//q的首地址赋值当前指针next指针变量。
pre=q;//将q的首地址转给pre
q->next=NULL;
}
return(head);
}
void printpy(polynomial *head)
{
int chang;
polynomial *p;
p=head->next;
chang=1;
while(chang)
{ chang=0;
if(p->next!=NULL)
{
printf(" %d %d",p->ceof,p->expn);
p=p->next;
chang=1;
}
else
printf(" %d %d",p->ceof,p->expn);
}
}
//多项式相加函数
polynomial * AddPolyn(polynomial *ha, polynomial *hb)
{
polynomial *qa,*qb,*pre;
int a,b,sum;
pre=ha;
qa=ha->next;
qb=hb->next;
while(qa&&qb)
{ a=qa->expn;
b=qb->expn;
switch(Compare_expn(a,b))
{
case 0:
sum=qa->ceof+qb->ceof;
if(sum)
{
qa->ceof=sum;
pre=qa;//当前指针pre后移到qa的位置
}
else//两项相加(数值相等,符号相异)和为零,所以释放qa。
{
pre->next=qa->next;//pre指向当前ha节点的指针。
free(qa);
}
qa=pre->next;
qb=qb->next;
break;
case -1:
pre=qa;
qa=qa->next;
break;
case 1:
pre->next=qb;
pre=qb;
qb=qb->next;
pre->next=qa;
break;
}
}
while(qb)
{
pre->next=qb;
qb=qb->next;
}
return (ha);}
//两个一元多项式相减
polynomial * MnsPolyn(polynomial *ha, polynomial *hb)
{
polynomial *qa,*qb,*pre;
int a,b,result;
pre=ha;
qa=ha->next;
qb=hb->next;
while(qa&&qb)
{ a=qa->expn;
b=qb->expn;
switch(Compare_expn(a,b))
{
case 0:
result=qa->ceof-qb->ceof;
if(result)
{
qa->ceof=result;
pre=qa;
}
else//两项相减为零,所以释放qa(也即删除qa)。
{
pre->next=qa->next;
}
qa=qa->next;
qb=qb->next;break;
case -1:
pre=qa;
qa=qa->next;break;
case 1:
pre->next=qb;
pre=qb;
qb=qb->next;
pre->next=qa;break;
}
}
if(qb)
{
pre->next=qb;
}
return (ha);
}
void MultPolyn(polynomial *hb,polynomial *hc)
{ polynomial *p,*q,*elem1,*elem2,*pre,*np;
p=hb->next;//指向hb的第一个节点。
elem1=(polynomial*)malloc(sizeof(polynomial));
elem1->next=NULL;
elem2=(polynomial*)malloc(sizeof(polynomial));
elem2->next=NULL;
pre=elem2;
while(p!=NULL)
{
for(q=hc->next;q;q=q->next)
{
np=(polynomial*)malloc(sizeof(polynomial));
np->ceof=p->ceof*q->ceof;
np->expn=p->expn+q->expn;
pre->next=np;
pre=np;
np->next=NULL;
}
p=p->next;
AddPolyn(elem1,elem2);
}
printf("第一个和第三个多项式相乘的结果:/n");
printpy(elem1);
printf("/n");
}
void main()
{
polynomial *ha,*hb,*hc,*p3;
FILE *fp,*fp1,*fp2,*fp3,p1;
printf("<******************一元多项式的操作******************>/n/n");
fp=fopen("E://a.txt","r");
fp1=fopen("E://b.txt","r");
fp2=fopen("E://c.txt","r");
fp3=fopen("E://d.txt","w");
//输出多项式
printf("从文件中读取两个一元多项式如下:/n/n");
printf("第一个多项式:y=");
PrintPolyn(fp);
printf("/n");
printf("第二个多项式:y=");
PrintPolyn(fp1);
printf("/n");
printf("第三个多项式:y=");
PrintPolyn(fp2);
printf("/n");
//fp指向文件已经读到最后了。想要再读则要再次打开
fp=fopen("E://a.txt","r");
fp1=fopen("E://b.txt","r");
fp2=fopen("E://c.txt","r");
//构建一元多项式和输出。
printf("/n");
printf("多项式链表构建成功,输出为:/n/n");
printf("第一多项式系数和指数为:/n");
ha=CreatPolyn(fp);
printpy(ha);
printf("/n");
printf("第二多项式系数和指数为:/n");
hb=CreatPolyn(fp1);
printpy(hb);
hc=CreatPolyn(fp2);
//多项式相加
printf("/n");
printf("两个多项式相加的和:/n");
AddPolyn(ha,hb);
printpy(ha);
printf("/n");
p3=ha->next;//指向链表的的一个节点
//向文件写入数据
for(int i=0;i<3;i++)
{
fprintf(fp3," %d %d",p3->ceof,p3->expn);
p3=p3->next;
}
fclose(fp3);
//多项式相减。
MnsPolyn(ha,hb);
printf("两个多项式相减的结果:/n");
printpy(ha);
printf("/n");
//多项式相乘
MultPolyn(hb,hc);
}