一元多项式
功能:1>.求解2个一元多项式的和
2>.求解2个一元多项式的差
3>.打印一元多项式
注:3>这个本来不算是一个功能,但是发现打印一元多项式的时候问题很多。例如:-1X应该打印成-X,X^0不应该应该打印出来
1.结点的定义
typedef struct Polynomial
{
int coef;
int expn;
struct Polynomial *next;
}Polynomial;
2.多项式的创建(尾插法)
Polynomial *Create_List()
{
int coef;
int expn;
Polynomial *pHead;
pHead=(Polynomial*)malloc(sizeof(Polynomial));
pHead->next=NULL;//很重要
Polynomial *pnew=NULL;
Polynomial *rear=NULL;
rear=pHead;
printf("请输入数字coef和expn\n");
scanf("%d %d",&coef,&expn);
while(coef!=0)
{
pnew=(Polynomial*)malloc(sizeof(Polynomial));
pnew->coef=coef;
pnew->expn=expn;
pnew->next=rear->next;
rear->next=pnew;
rear=pnew;
scanf("%d %d",&coef,&expn);
}
printf("创建完成!\n");
return pHead;
}
3.多项式求和
Polynomial *AddPolyn(Polynomial *pa,Polynomial *pb)
{
Polynomial *pc=(Polynomial*)malloc(sizeof(Polynomial));//尾结点
Polynomial *chead=pc;//头结点
pc->next=NULL;
Polynomial *qa=pa->next;
Polynomial *qb=pb->next;
Polynomial *qc=NULL;//新结点
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)
{
qc->coef=qb->coef;
qc->expn=qc->expn;
qc=qc->next;
}
else
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
}
if(qc->coef!=NULL)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else
free(qc);
}
while(qa!=NULL)
{
qc=(Polynomial*)malloc(sizeof(Polynomial));
qc->coef=qa->coef;
qc->expn=qa->expn;
qc->next=pc->next;
pc->next=qc;
pc=qc;
qa=qa->next;
}
while(qb!=NULL)
{
qc=(Polynomial*)malloc(sizeof(Polynomial));
qc->coef=qb->coef;
qc->expn=qb->expn;
qc->next=pc->next;
pc->next=qc;
pc=qc;
qb=qb->next;
}
return chead;
}
设计思路:
1>.当qa与qb结点都不为空时,将结点qx->expn较小的结点赋给qc,并且将qc采用尾插法连接给pc;
相等时,qa与qb进行运算,将结果赋给qc并且将qc采用尾插法连接给pc
2>.当qa为空时,将pb中未遍历的结点逐一复制连接在pc后面
3>.当qa为空时,将pb中未遍历的结点逐一复制连接在pc后面
4.多项式求差
Polynomial *SubPolyn(Polynomial *pa,Polynomial *pb)
{
Polynomial *headc=NULL;
Polynomial *p=pb->next;
while(p!=NULL)
{
p->coef=p->coef*(-1);
p=p->next;
}
headc=AddPolyn(pa,pb);
p=pb->next;
while(p!=NULL)
{
p->coef=p->coef*(-1);
p=p->next;
}
return headc;
}
设计思路:
1>.由于要实现多项式pc-pb,可以考虑将多项式pb的每一项的系数*-1;
2>.调用求和函数
3>.恢复多项式pb,将多项式pb的每一项的系数*-1
5.打印多项式
说明:原本以为这只是一个很简单的打印函数,但是却是花的时间最长的。。。。。。。因为考虑的东西稍微有点多
int Print_List(Polynomial *pHead)
{
Polynomial *p=pHead->next;
int flag=0;
if(p==NULL)
{
printf("链表为空!\n");
return 0;
}
else{
while(p!=NULL){
if(flag!=0&&p->coef>0)
putchar('+');
if(p->coef!=1&&p->coef!=-1)
{
printf("%d",p->coef);
if(p->expn==1) putchar('X');
else if(p->expn) printf("X^%d",p->expn);//不为0
}
else
{
if(p->coef==1)
{
if(!p->expn) putchar('1');//为0
else if(p->expn=1) putchar('X');
else printf("X%d",p->expn);
}
if(p->coef==-1)
{
if(!p->expn) printf("-1");
else if(p->expn==1)
printf("-X");
else printf("-X^%d",p->expn);
}
}
p=p->next;
flag=1;
}
}
printf("\n");
return 1;
}
设计思路:
1.首先区分打印的是不是多项式的第一个数,因为当多项式的第一个数为整数时不应该打印"+"号,其余的应该打印"+"号
2.其次,因该分为三种情况
1>.多项式的系数不为-1&&+1;
2>.多项式的系数不为-1
3>.多项式的系数不为-1
在以上三种情况的基础上必须讨论多项式X的指数是不是为0;