多项式相加

#include<stdio.h>
#include<malloc.h>

typedef struct Node                        //多项式数据类型的定义
{
float coef;                                   //系数
int   exp;                                   //指数
struct Node *next;                            //指向多项式的下一结点
}PolyNode;

PolyNode * Createpoly()                            //创建链表       
{
PolyNode *L,*r,*s;
float coef;
int   exp;
L=(PolyNode *)malloc(sizeof(PolyNode));         //申请表头结点空间
r=L;                                             //r为尾指针
printf("coef:");
scanf("%f",&coef);
printf("exp: ");
scanf("%d",&exp);
while(coef!=0)
{
s=(PolyNode *)malloc(sizeof(PolyNode));          //建立项的结点,并插在链尾
s->coef=coef;
s->exp=exp;
r->next=s;
r=s;
printf("coef:");
scanf("%f",&coef);
printf("exp: ");
scanf("%d",&exp);
}
r->next=NULL;
return(L);
}

void Addpoly(PolyNode *pa, PolyNode *pb)                 //两个多项式相加
{
PolyNode *p,*q,*r,*temp;                                  //temp用来存放临时结点
float sum;
p=pa->next;
q=pb->next;
r=pa;
while(p&&q)
{
if(p->exp<q->exp)                //p指向的项指数小于q,尾指针指向p,且将p指向链表的下一结点
{
   r=p;
   p=p->next;
}
else if(p->exp==q->exp)            //指数相等时,系数相加
{
   sum=p->coef+q->coef;
   if(sum!=0)
   {
    
    p->coef=sum;
    r=p;
   }
   else                           //系数相加为0
   {
    r->next=p->next;
    free(p);
   }
   p=r->next;
   temp=q;
   q=q->next;
}
else                               //q指向项指数小于p时,将q加入多项式中
{
   temp=q->next;
   q->next=p;
   r->next=q;
   r=q;
   q=temp;
}
}
if(q)
r->next=q;
free(pb);
}

void Print(PolyNode * p)                     //打印多项式
{    
int i=0;
    while(p->next)
    {   
        p=p->next;
   i++;
        printf("     %g*x^%d\n",p->coef,p->exp);   
           
    }
printf("一共有%d项\n",i);
}  

int main()              //主函数
{
PolyNode * pa,* pb;int i;
printf("\n**********^-^欢迎光临^-^**********\n");
printf("\n请输入多项式a(按指数递增顺序输入):\n");
pa=Createpoly();
Print(pa);
printf("\n请输入多项式b(按指数递增顺序输入):\n");
pb=Createpoly();
Print(pb);
    printf("\n多项式相加结果是:\n");
    Addpoly(pa,pb);
    Print(pa);
    printf("\n");
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值