#include<stdio.h>
#include<stdlib.h>
typedef struct nodetype
{
float coef;
int expn;
struct nodetype *next;
}nodetype;
nodetype *creatpoly()
{
nodetype *head,*rear,*s;
float c;
int e;
head=(nodetype *)malloc(sizeof(nodetype));
head->next=NULL;
rear=head;
printf("请输入多项式的系数和指数,用空格隔开,系数为0时结束输入,指数按从小到大的顺序输入\n");
scanf("%f%d",&c,&e);
while(c!=0)
{
s=(nodetype *)malloc(sizeof(nodetype));
s->coef=c;
s->expn=e;
rear->next=s;
rear=s;
printf("请输入多项式的系数和指数,用空格隔开,系数为0时结束输入,指数按从小到大的顺序输入\n");
scanf("%f%d",&c,&e);
}
rear->next=NULL;
return (head);
}
nodetype *printpoly(nodetype *head)
{
nodetype *q;
q=head->next;
int flag=1;
if(!q)
{
putchar('0');
printf("\n");
return head;
}
while(q)
{
if(q->coef>0&&flag!=1)
putchar('+');
if(q->coef!=1&&q->coef!=-1)
{
printf("%g",q->coef);
if(q->expn==1)
putchar('X');
else if(q->expn)
printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn)
putchar('1');
else if(q->expn==1)
putchar('X');
else
printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn)
printf("-1");
else if(q->expn==1)
printf("-X");
else
printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
return head;
}
nodetype *addpoly(nodetype *ahead,nodetype *bhead)
{
nodetype *pa,*pb,*chead,*pc,*qc;
pa=ahead->next;
pb=bhead->next;
pc=(nodetype *)malloc(sizeof(nodetype));
pc->next=NULL;
chead=pc;
while(pa!=NULL&&pb!=NULL)
{
qc=(nodetype *)malloc(sizeof(nodetype));
if (pa->expn<pb->expn)
{
qc->coef=pa->coef;
qc->expn=pa->expn;
pa=pa->next;
}
else if(pa->expn>pb->expn)
{
qc->coef=pb->coef;
qc->expn=pb->expn;
pb=pb->next;
}
else
{
qc->coef=pa->coef+pb->coef;
qc->expn=pa->expn;
pa=pa->next;
pb=pb->next;
}
if(qc->coef!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else
free(qc);
}
while(pa!=NULL)
{
qc=(nodetype *)malloc(sizeof(nodetype));
qc->coef>=pa->coef;
qc->expn=pa->expn;
pa=pa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(pb!=NULL)
{
qc=(nodetype *)malloc(sizeof(nodetype));
qc->coef>=pb->coef;
qc->expn=pb->expn;
qc->next=pc->next;
pb=pb->next;
pc->next=qc;
pc=qc;
}
return chead;
}
nodetype *jianpoly(nodetype *ahead,nodetype *bhead)
{
nodetype *h,*p,*chead;
h=bhead;
p=bhead->next;
while(p!=NULL)
{
p->coef=p->coef*(-1);
p=p->next;
}
chead=addpoly(ahead,h);
for(p=h->next;p;p=p->next)
p->coef*=-1;
return chead;
}
int main(void)
{
nodetype *ahead,*bhead,*chead;
int choice;
printf("建立A多项式\n");
ahead=creatpoly();
printf("建立B多项式\n");
bhead=creatpoly();
printf("多项式a为\n");
ahead=printpoly(ahead);
printf("多项式b为\n");
bhead=printpoly(bhead);
printf("请选择您要进行的运算,进行加法请按‘1’,进行减法请按2,如要退出请按0\n");
printf("请输入您的选择\n");
scanf("%d",&choice);
while(choice!=0)
{
if(choice==1)
{
chead=addpoly(ahead,bhead);
chead=printpoly(chead);
}
else if(choice==2)
{
chead=jianpoly(ahead,bhead);
chead=printpoly(chead);
}
else
{
printf("输入错误请重新输入\n");
scanf("%d",&choice);
}
printf("请输入您的选择\n");
scanf("%d",&choice);
}
return 0;
}