作为一名数据结构的初学者,刚开始接触到算法思想,我表示还是有一些难度。学到的知识不能和实际问题联系起来是我最大的问题,有时候问题的算法思想懂得,但是到了敲代码的时候,却不知道从何下手,不过还是要对自己有信心啦,只要好好学,肯定会慢慢进步的。
-----------------------------------------------------------------------------
回归正题,多项式的各种运算其实不是那么困难,最关键的就是具备统筹思想,在敲每一种运算之前,都要事先想好自己的思路,那样就可以流畅的敲完代码了,每写一行代码,就想一下逻辑有没有出错,避免在编译过程中没有出错,运行时却出现错误。为了找bug,浪费本该做别的事的时间。
思想:
1.创建链表,将多项式以链表形式存放
2.多项式加法:1)当两个多项式均未扫描完毕,比较两个多项式的指数进行相应的运算
2)当其中一个表达式已经结束,令一个表达式还未结束,则直接把剩余的项链接在求和之后的链表后面
3.多项式减法:与多项式加法的思想一致
4.多项式乘法:了解多项式乘法的机制:第一个多项式的每一项分别与第二个多项式的每一项相乘,然后合并同类项
5.多项式的输出:为了便于操作,我们用链表存储多项式,但是最后得输出一个读者能一眼认出的多项式
#include<stdio.h>
#include<stdlib.h>
typedef struct rolynomial
{
float coef;
int expn;
struct rolynomial *next;
}rolyn;
rolyn *creatroly() //尾差法建立多项式
{
float x;
int y;
rolyn *head,*p,*q;
head=(rolyn *)malloc(sizeof(rolyn));
p=head;
printf("please input the coef and expn:\n");
scanf("%f%d",&x,&y);
while(x!=0)
{
q=(rolyn *)malloc(sizeof(rolyn));
q->coef=x;
q->expn=y;
p->next=q;
p=q;
printf("please input the coef and expn:\n");
scanf("%f %d",&x,&y);
}
p->next=NULL;
return (head);
}
rolyn *addroly(rolyn *pa,rolyn *pb) //两个多项式相加
{
rolyn *qa,*qb;
rolyn *headc,*pc,*qc;
qa=pa->next;
qb=pb->next;
pc=(rolyn *)malloc(sizeof(rolyn));
headc=pc;
pc->next=NULL;
while(qa!=NULL&&qb!=NULL) //当两个多项式均未扫描完时
{
qc=(rolyn *)malloc(sizeof(rolyn));
if(qa->expn<qb->expn)
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
}
else if(qa->expn==qb->expn)
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
}
else
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
}
if(qc->coef!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else
{
free(qc);
}
}
while(qa!=NULL) //如果pa有剩余项
{
qc=(rolyn *)malloc(sizeof(rolyn));
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(qb!=NULL) //如果pb有剩余项
{
qc=(rolyn *)malloc(sizeof(rolyn));
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
return headc;
}
void cheng(rolyn *pa,rolyn *pb,rolyn *head ) //多项式乘法
{
rolyn *qa, *qb,*pc,*qc,*t;
qa=pa->next;
qb=pb->next;
pc=head;
t=qb;
while(qa)
{
while(qb)
{
qc=(rolyn *)malloc(sizeof(rolyn));
qc->coef=qa->coef*qb->coef;
qc->expn=qa->expn+qb->expn;
pc->next=qc;
pc=qc;
qb=qb->next;
}
qa=qa->next;
qb=t;
}
qc->next=NULL;
}
void sum(rolyn *head) //合并同类项
{
rolyn *p,*q,*t,*m;
p=head->next;
while(p)
{
m=p;
q=p->next;
while(q)
{
if(p->expn==q->expn)
{
p->coef=p->coef+q->coef;
m->next=q->next;
t=q;
q=q->next;
free(t);
}
else
{
q=q->next;
m=m->next;
}
}
p=p->next;
}
}
void printroly(rolyn *p) //输出多项式
{
rolyn *q;
q=p->next;
int flag=1;
if(!q)
{
putchar('0');
printf("\n");
}
while(q)
{
if(q->coef>0&&flag!=1)
{
putchar('+');
}
if(q->coef!=1&&q->coef!=-1)
{
printf("%f",q->coef);
if(q->expn==1) printf("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) putchar('-1');
else if(q->expn==1) putchar('-x');
else printf("-x^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
}
int main()
{
rolyn *heada,*headb,*head;
heada=creatroly(); //创建a多项式
printroly(heada);
headb=creatroly(); //创建b多项式
printroly(headb);
head=addroly(heada,headb); //多项式的和
printroly(head);
cheng(heada,headb,head);
printroly(head); //多项式乘法
sum(head);
printroly(head);
return 0;
}
这是一个可以运行的代码,思想正确,但是代码有一些繁琐,希望读者能给一些宝贵的意见,谢谢