#include<stdio.h>
#include<stdlib.h>
typedef struct
{
float coef;
int expn;
struct Polynomial* next;
}Polynomial;
//建立多项式
Polynomial *CreatePoly()
{
Polynomial *head,*rear,*s;
int c,e;
head = (Polynomial *)malloc(sizeof(Polynomial));//建立多项式的头结点
rear = head;//rear始终指向单链表的尾部,便于尾插法建表
scanf("%d,%d",&c,&e);//键入多项式的系数项和指数项
while(c!=0)//若c=0,则代表多项式键入结束
{
s=(Polynomial *)malloc(sizeof(Polynomial));
s->coef=c;
s->expn=e;
rear->next=s;
rear=s;
scanf("%d,%d",&c,&e);
}
rear->next=NULL;//将表中最后一个节点的next置为空
return head;
}
//输出多项式
void PrintPolyn(Polynomial *p)
{
Polynomial *q;
q=p->next;
int flag=1;
if(!q)//删除掉所有的带0元素
{
putchar('0');
printf("\n");
return;
}
while(q)//全是数据,非0数,所以一直为真
{
if(q->coef>0&&flag!=1)
putchar('+');
if(q->coef!=1&&q->coef!=-1)
{
//打印系数
printf("%g",q->coef);//自动舍弃小数点后面的0
if(q->next==1)
putchar('X');
else if(q->expn)//只要指数项非0就可以执行
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");
}
//两个多项式相加
//coef--系数
//expn--指数
Polynomial *AddPolyn(Polynomial *pa,Polynomial *pb)
{
Polynomial *qa=pa->next;
Polynomial *qb=pb->next;
Polynomial *headc,*pc,*qc;
pc=(Polynomial *)malloc(sizeof(Polynomial));//单链表pc用来存放pa+pb的和
pc->next=NULL;
headc=pc;
while(qa!=NULL&&qb!=NULL)
{
qc=(Polynomial *)malloc(sizeof(Polynomial));
//前一个多项式的的指数小于后一项时;可以直接进行加法运算,但是并不会合并,任然是两个同的多项式
if(qa->expn<qb->expn)//规则一
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
}
//如果两个多项式指数相等,则系数可以直接进行加法运算,将两项合并
else if(qa->expn==qb->expn)//规则2
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
}
//虽然没有if语句判断条件,但可以明显看出条件是 qa->expn > qb->expn,结果仍为两个多项式,不会合并
else//规则3
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
}
//在多项式有值的情况下,将值传给pc,带出
//但是pc又等于headc,由于是指针,就会同样改变headc的值,结果就再转换成由headc带出
if(qc->coef!=0)
{
qc->next=qc->next;
pc->next=qc;
pc=qc;
}
//多项式没有值,要么没输入,要么输入错误,自动释放空间,无返回值
else
free(qc);
}
//这里指的是第一个多项式 pa 中有的多项式,但第一个多项式 pb 中没有的,不用这个循环会漏掉
while(qa !=NULL)//pa中如果有剩余,将余项插入到PC中
{
qc=(Polynomial*)malloc(sizeof(Polynomial));
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
//这里指的是第二个多项式 pb 中有的多项式,但第一个多项式 pa 中没有的,不用这个循环会漏掉
while(qb!=NULL)//pb如果有剩余,将剩余项插入到pc中
{
qc=(Polynomial*)malloc(sizeof(Polynomial));
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
qc->next=NULL;
return headc;
}
//两个多项式相减
Polynomial *SubtractPolyn(Polynomial *pa,Polynomial *pb)
{
Polynomial *h=pb;
Polynomial *p=pb->next;
Polynomial *pd;
while(p)
{
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);//调用了两个多项式相加
for(p=h->next;p;p=p->next)
p->coef*=-1;
return pd;
}
//乘法运算
Polynomial *MulPolyn(Polynomial *pa,Polynomial *pb)
{
Polynomial *qa=pa->next;
Polynomial *qb=pb->next;
Polynomial *headc,*pc,*qc;
pc=( Polynomial *)malloc(sizeof( Polynomial));
pc->next=NULL;
headc=pc;
while(qa!=NULL)
{
while(qb!=NULL)
{
qc=(Polynomial *)malloc(sizeof( Polynomial));
qc->coef=(qa->coef)*(qb->coef);
qc->expn=(qa->expn)+(qb->expn);
qb=qb->next;
qc->next=pc->next;
pc->next=qc;//qc的指数和系数都还在qc中,所以把qc赋值给pc的next结点,因为pc本身为空,就是用来装新的数据的
pc=qc;
}
qa=qa->next;
if(qa!=NULL)
qb=pb->next;
}
pc=qc;//pc同步qc,将首地址传给pc
qc->next=NULL;
return headc;//pc同步headc,由headc传出首地址
}
int main()
{
Polynomial *q3;
Polynomial *q4;
Polynomial *q5;
int num=1;
printf("请输入你的选项:\n");
printf("0.退出!\n");
printf("1.建立多项式\n");
printf("2.多项式相加\n");
printf("3.多项式相减\n");
printf("4.输出多项式\n");
printf("5.多项式相乘\n");
while(num!=0)
{
printf("请输入你的指令:");
scanf("%d",&num);
switch(num)
{
case 0:num=0;
break;
case 1:
printf("系数与指数之间用逗号隔开\n");
printf("0表示结束输入\n");
printf("请输入建立的第一个多项式:");
Polynomial *q1=CreatePoly();
printf("请输入建立的第二个多项式:");
Polynomial *q2=CreatePoly();
break;
case 2:q3=AddPolyn(q1,q2);
printf("两个多项式相加的结果为:\n");
PrintPolyn(q3);
break;
case 3:q4=SubtractPolyn(q1,q2);
printf("两个多项式相减的结果为:\n");
PrintPolyn(q4);
break;
case 4:printf("多项式1:\n");
PrintPolyn(q1);
printf("多项式2:\n");
PrintPolyn(q2);
break;
case 5:q5=MulPolyn(q1,q2);
printf("两个多项式相乘的结果为:\n");
PrintPolyn(q5);
break;
default:printf("指令错误!请重输:\n");
break;
}
}
}