c++单链表 一元多项式求和_用单链表实现一元多项式相加 C++代码

#include

using namespace std;

/*结点的定义*/

typedef struct LNode

{

float coef;

int exp;

struct LNode *next;

}LNode;

typedef LNode *Polynomial;

/*多项式的初始化*/

void initDuoX(Polynomial &Px)

{

Px=new LNode;

Px->next=NULL;

}

/*用正序插入法建立多项式*/

void creatDuoX(Polynomial &Px,int n)

{

initDuoX(Px);

LNode *p,*q;

p=Px;

for(int i=0;i

{

q=new LNode;

cin>>q->coef>>q->exp;

q->next=NULL;

p->next=q;

p=q;

}

}

/*求多项式的长度*/

int lengthDuoX(Polynomial &Px)

{

LNode *p;

int count;

p=Px->next;

count=0;

while(p!=NULL)

{

p=p->next;

count++;

}

return count;

}

/*输出多项式*/

void outputDuoX(Polynomial &Px)

{

LNode *p;

p=Px->next;

int i;

for(i=0;i

{

cout<coef<exp<

p=p->next;

}

cout<

}

/*多项式相加*/

LNode * addDuoX(Polynomial &Pa,Polynomial &Pb)

{

LNode *p,*q;

LNode *prep;//prep指向p的前驱。

LNode *u;

p=Pa->next;

q=Pb->next;//p、q分别指向多项式的第一项。

prep=Pa;//因为是Pb加到Pa上,所以此处不需要使用q的前驱。

while (p&&q)

{

if(p->expexp)//第一种情况,指针只需后移。

{

prep=p;

p=p->next;

}

else if(p->exp > q->exp)//第二种情况,将q结点插入到p结点之前。

{

u=q->next;

q->next=p;

prep->next=q;

prep=q;

q=u;

}

else//第三种情况,系数进行相加。

{

p->coef=p->coef+q->coef;

if(p->coef==0)//系数相加等于0

{

LNode *temp1;

LNode *temp2;

temp1=p;

temp2=q;

prep->next=p->next;

p=p->next;

q=q->next;

delete temp1;//这里不能直接释放p结点。

delete temp2;

}

else

{

LNode *temp2;

temp2=q;

prep=p;

p=p->next;

q=q->next;

delete temp2;

}

}

}

if(q)

prep->next=q;

delete Pb;

return Pa;

}

void main()

{

Polynomial Pa,Pb,Pc;

creatDuoX(Pa,4);

creatDuoX(Pb,5);

Pc=addDuoX(Pa,Pb);

outputDuoX(Pc);

}

总体上来说,虽然是两个多项式相加,但两个多项式的地位是不一样的。是Pb加到Pa上,所以对两个多项式的处理也不一样。

虽然是照着算法写这个程序,可是还是费了老大的劲,才把它写出来,而且还出错了!经过调试之后,测试了一组数据,呵呵,正确!为确保万无一失,再测一组,呜呜,错了!所以写了程序,要多测几组数据 ,才能确保万无一失。

写这个程序没有学到多少新的东西,但是让我对单链表有了更深的理解,并且能够更加牢固的掌握它!嘿嘿,自己要加油啊!!!

写程序,写程序,乐在其中!!!

PS:另外推荐一个让大家真正练手的网站:猪八戒威客网,在这里可以按自己的能力去接一些程序设计的任务。我觉得这是一种很不错的学习方法,当你接了别人的任务,无形中就给了自己压力和动力,然后就会主动的去查询资料,分析问题,可能会历经艰辛才能解决问题,但这中间的过程是很珍贵的,你会通过自己的努力学到很多课本上没有学到的东西,也能过一回需求分析的瘾,真实的体会到和客户进行交流的诸多“纠结”,最后,如果你的努力得到客户的认可,可以获得一笔小小的佣金,当做对自己的奖励,更重要的是,通过做任务,你能体会到自己存在的价值感和对自己能力的肯定!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值