C语言单链多项式相加

#include <stdio.h>
#include <stdlib.h>
//定义多项式的存储结构
typedef struct ploy
{
float coef;//系数
int exp;//指数
struct ploy *next;//指向下一个结点的指针
};
//创建具有指定节点个数的带头结点链表(表达式有n项)
ploy *crePoly()
{
ploy *q, *p, *head;
int n;
printf("\n请输入多项式的项数:");
scanf("%d",&n);
head = (ploy *)malloc(sizeof(ploy));
if(!head)
{
printf("申请内存失败!");
exit(0);
}
head->next = NULL;
//q指向当前节点,p指向新生成的节点
q = head;
for(int i = 1; i <= n; i ++)
{
p = (ploy *)malloc(sizeof(ploy));
printf("系数:");
scanf("%f",&p->coef);
printf("指数:");
scanf("%d",&p->exp);
q->next = p;
q = p;
q->next = NULL;
}
return(head);
}
//系数比较函数
int cmp(ploy *ployna, ploy *ploynb)
{
if(ployna->exp > ploynb->exp)
return 1;
else if(ployna->exp < ploynb->exp)
return -1;
else
return 0;
}

//输出多项式
void print(ploy *p)
{
while(p->next != NULL)
{
p = p->next;
printf("%.0f*X^%d",p->coef,p->exp);
if(p->next != NULL)
printf("+");
}
}

/*多项式相加的函数,相加的结果保存到链表plonyna中,删除ploynb*/
void ploynadd(ploy *ployna, ploy *ploynb)
{
ploy *p,*q,*pa,*temp,*qb;
p = ployna->next;//p指向ployna的第一个节点
q = ploynb->next;//q指向ployna的第一个节点
pa=ployna;//pa指向q的前驱
qb = q;
int sum;
while(p != NULL && q != NULL)//当两个多项式均未扫描到最后一项时
{
switch(cmp(p, q))
{
case 1:
pa = pa->next;
p = p->next;
break;
case -1:
qb = qb->next;
pa->next = q;
q->next = p;
q = qb;
pa = pa->next;
break;
case 0:
sum = p->coef + q->coef;
if(sum != 0)//系数和不为0时,删除q节点
{
p->coef=sum;
pa = pa->next;
p = p->next;
temp = q;
q=q->next;
qb=q;
free(temp);
}
else//系数和为0时,同时删除两个节点p和q
{
temp=p->next; free(p);p=temp;
temp=q->next; free(q);q=temp;
}
break;
}
}
if(p!=NULL) //多项式A中还有剩余,则将剩余的结点加入到和多项式中
 pa->next=p;
else //否则将B的结点加入到和多项式中
pa->next=q;
}
/*主函数*/
int main()
{
printf("请按照指数从大到小的顺序输入\n");
ploy *ployna,*ploynb;
ployna = crePoly();
print(ployna);
ploynb = crePoly();
print(ploynb);
printf("\n");
ploynadd(ployna,ploynb);
print(ployna);
printf("\n");

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没关系的朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值