多项式是数学中常用的一种表达式,现在我们给出用c语言编程实现多项式的计算,并且多项式的计算是链表的典型应用,通过编程实现多项式,也为我们巩固一下链表的知识以及它的生活应用。
下面给出代码
#include
#include
#include
typedef struct node
{ float coef; //系数域
int exp; //指数域
struct node *next; //指针域
}*polynode;
int LocateElem(polynode L,int e) //在链表中查找与e相等的元素并返回元素位置
{ int i;
polynode p;
p=L->next;
for(i=0;i<L->exp;i++)
{
if(p->exp==e)
return i+1;
p=p->next;
}
return 0;
}
int CreatePoly(polynode &L ,int m)
{ int i;
L=(polynode)malloc(sizeof(polynode));
L->coef=0.0;
L->exp=0; //头指针指数域中存放链表长度
polynode p,r;
r=L;
for(i=0;i<m;i++) //依次输入 m 个非零项
{ p=(polynode)malloc(sizeof(polynode));
scanf("%f,%d",&p->coef,&p->exp);
if(!LocateElem(L,p->exp)) //如果表中不存在相同指数项,则插入
{ r->next=p;
r=p;
L->exp++; //表长++
}
}
r->next=NULL;
return 1;
}
void print(polynode L)//打印函数
{ int i=0;
polynode p;
p=L->next;
while(i<L->exp)
{
printf("%.2f,%d ",p->coef,p->exp);
p=p->next;
i++;
if(i%10==0)
printf("\n");
}
}
void AddPoly(polynode &La,polynode &Lb) //多项式相加
{ polynode p,q,pre,r; //p,q为LaLb当前指针节点 ,pre为指向La中p的前一个节点,r为Lb中的交换容器
float x;
p=La->next;
q=Lb->next;
pre=La;
while((p!=NULL)&&(q!=NULL))
{ if(p->exp<q->exp)
{ pre=p; //pre为指向La中p的前一个节点
p=p->next;
}
else if(p->exp==q->exp)
{ x=p->coef+q->coef; //系数相加
if(x!=0)
{ p->coef=x;
pre=p;
}
else
{ pre->next=p->next; //如果等于0,则删除等于0的节点
free(p);
La->exp--; //La长度-1
}
p=pre->next;
r=q; //删除q节点前先赋给r
q=q->next;
free(r); //删除q节点
Lb->exp--; //Lb长度-1
}
else //如果Lb指数项小,则插入到La中
{ r=q->next; //因为q也要往下走,所以用r来做中间容器
q->next=p; //插入到p之前
pre->next=q;
pre=q; //改变pre的指向
q=r; //因为q也要往下走,所以用r来做中间容器
La->exp++; //长度+1
Lb->exp--; //Lb长度-1
}
}
if(q!=NULL) //链接p的剩余节点
{ pre->next=q;
La->exp+=Lb->exp; //LaLb长度相加
}
free(Lb);
}
void SubtractPoly(polynode &La,polynode &Lb) //多项式相减
{ polynode p,q,pre,r; //p,q为LaLb当前指针节点 ,pre为指向La中p的前一个节点,r为Lb中的交换容器
float x;
p=La->next;
q=Lb->next;
pre=La;
while((p!=NULL)&&(q!=NULL))
{ if(p->exp<q->exp)
{ pre=p; //pre为指向La中p的前一个节点
p=p->next;
}
else if(p->exp==q->exp)
{ x=p->coef-q->coef; //系数相加
if(x!=0)
{ p->coef=x;
pre=p;
}
else
{ pre->next=p->next; //如果等于0,则删除等于0的节点
free(p);
La->exp--; //La长度-1
}
p=pre->next;
r=q; //删除q节点前先赋给r
q=q->next;
free(r); //删除q节点
Lb->exp--; //Lb长度-1
}
else //如果Lb指数项小,则插入到La中
{ r=q->next; //因为q也要往下走,所以用r来做中间容器
q->coef=-q->coef;
q->next=p; //插入到p之前
pre->next=q;
pre=q; //改变pre的指向
q=r; //因为q也要往下走,所以用r来做中间容器
La->exp++; //长度+1
Lb->exp--; //Lb长度-1
}
}
if(q!=NULL) //链接p的剩余节点
{ pre->next=q;
while(q)
{ q->coef=-q->coef;
q=q->next;
}
La->exp+=Lb->exp; //LaLb长度相加
}
free(Lb);
}
polynode MultiplyPoly(polynode La,polynode Lb) //多项式相乘
{
polynode p,q,r,Lc,pre,rear,s; //Lc为最终生成的链表 r为交换容器( rear为Lc中的当前指针 s为生成的新节点
p=La->next;
q=Lb->next;
Lc=(polynode)malloc(sizeof(polynode));
Lc->exp=0;
rear=Lc;
while(q) //将La的第一项与Lb的每个项相乘
{
s=(polynode)malloc(sizeof(polynode));
s->exp=p->exp+q->exp;
s->coef=p->coef*q->coef;
s->next=NULL;
rear->next=s;
rear=s;
Lc->exp++;
q=q->next;
}
p=p->next;
while(p)// 下面依次将元素插入到Lc中
{ rear=Lc->next;
q=Lb->next;
while(q)
{ s=(polynode)malloc(sizeof(polynode));
s->exp=p->exp+q->exp;
s->coef=p->coef*q->coef;
s->next=NULL;
rear=Lc->next;
pre=rear;
while(rear) //判断系数 与之前的相加函数类似
{
if(rear->exp<s->exp)
{ pre=rear;
rear=rear->next;
}
else if(rear->exp==s->exp) //如果系数相等,则相加
{
if((rear->coef+s->coef)!=0)
{
pre=rear;
rear->coef+=s->coef;
}
else
{ pre->next=rear->next;
free(rear);
Lc->exp--;
}
rear=pre->next;
break;
}
else //如果之前没有,则插入
{ s->next=rear;
pre->next=s;
pre=s;
Lc->exp++;
break;
}
}
if((s!=NULL)&&(rear==NULL)) //如果后面还有项,则补到Lc后
{pre->next=s;
Lc->exp++;
}
q=q->next;
}
p=p->next;
}
return Lc;
}
void Substitution(polynode L,float x)
{ float sum=0;
polynode p;
p=L->next;
while(p)
{
sum+=p->coef*pow(x,p->exp);
p=p->next;
}
printf("代入结果为:%f",sum);
}
void menu()
{
printf("\n-------------------------------------1.两个多项式相加----------------------------------------------------------");
printf("\n-------------------------------------2.两个多项式相减----------------------------------------------------------");
printf("\n-------------------------------------3.两个多项式相乘----------------------------------------------------------");
printf("\n-------------------------------------4.打印多项式--------------------------------------------------------------");
printf("\n-------------------------------------5.带入x值运算--------------------------------------------------------------");
}
int main()
{ int choose,m,n,x,sum;
polynode La,Lb,Lc;
printf("输入多项式La的项数:\n");
scanf("%d",&m);
printf("\n输入多项式La:\n");
CreatePoly(La,m);
printf("输入多项式Lb的项数:\n");
scanf("%d",&n);
printf("\n输入多项式Lb:\n");
CreatePoly(Lb,n);
menu();
p:
printf("\n请输入你的选项: ");
scanf("%d",&choose);
switch(choose)
{
case 1:printf("\n相加后的多项式为:\n");AddPoly(La,Lb);print(La); goto p;
case 2:printf("\n相减后的多项式为:\n");SubtractPoly(La,Lb);print(La);goto p;
case 3:printf("\n相乘后的多项式为:\n");Lc=MultiplyPoly(La,Lb);print(Lc);goto p;
case 4:print(La);goto p;
case 5:printf("请输入要带入的x的值");scanf("%d",&x);Substitution(La,x); goto p;
}
return 0;
}