c语言数据结构多项式的相加

#include<iostream>
using namespace std;

//多项式相加
typedef struct PNode
{
float coef;//系数
int expn;//指数
struct PNode *next;
}PNode,*Polynomial;

//多项式的创建
void CreatePolyn(Polynomial &P,int n)
{
P=new PNode;
P->next=NULL;//创建带头节点的单链表
for(int i=1;i<=n;i++)
{
PNode *s=new PNode;//生成新结点
cin>>s->coef>>s->expn;//依次输入多项式的系数和指数
PNode *pre=P;//pre用来保存q的前驱,初始值是头节点
PNode *q=P->next;//q初始化,指向首元结点
while(q&&q->expn<s->expn)//通过比较找到第一个大于输入项指数的项*q
{
pre=q;
q=q->next;
}
s->next=q;//将输入项s插入*q和其前驱节点pre之间
pre->next=s;
}
}
void AddPolyn(Polynomial &Pa, Polynomial &Pb)
{
PNode *qa = Pa->next, *qb = Pb->next, *pre = Pa;//qa指向多项式Pa的第一个非零项,
// qb指向 多项式Pb的第一个非零项,pre指向Pa的头节点,用于插入新节点。
while(qa && qb)//判断两个多项式是否含有非零项
{
if(qa->expn == qb->expn)//非零项指数相同,则可以合并系数
{
qa->coef += qb->coef;
if(qa->coef == 0)//判断当前是否要删除Pa中的节点
{
pre->next = qa->next;
delete qa;
qa = pre->next;
}
else
{
pre = qa;
qa = qa->next;
}
qb = qb->next;
}
else if(qa->expn < qb->expn)//当前Pa指针后移
{
pre = qa;
qa = qa->next;
}
else//此时Pa的当前项指数小于Pb的当前项指数,在Pa中插入新节点,后面接上Pb的项
{
PNode *s = new PNode;
s->coef = qb->coef;
s->expn = qb->expn;
s->next = qa;
pre->next = s;
pre = s;
qb = qb->next;
}
}
if(qb)//剩余多项式Pb中还有非零多项式没有合并,则把他们全部插入到Pa的末尾,合并成一个多项式
{
pre->next = qb;
}
delete Pb;//释放Pb的头结点
}
int main()
{
Polynomial Pa,Pb;
int n,m;
cout<<"请输入多项式Pa的项数:";
cin>>n;
cout<<"请输入多项式Pa各项的系数和指数,并用空格隔开:";
CreatePolyn(Pa,n);
cout<<"请输入多项式Pb的项数:";
cin>>m;
cout<<"请输入多项式Pb各项的系数和指数,并用空格隔开:";
CreatePolyn(Pb,m);
AddPolyn(Pa,Pb);
PNode *p = Pa->next;
while(p)
{
cout<<p->coef<<"x^"<<p->expn<<" ";
p = p->next;
}
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值