数据结构--多项式的相加(单链表的应用C++)

 

#include<iostream>
using namespace std;
typedef struct PNode{
	float coef;//系数
	int expn;//指数 
	struct PNode *next;//指针域
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P,int n); 
void AddPolyn (Polynomial &Pa , Polynomial &Pb); 
int main(){
	PNode *Pa,*Pb;
	PNode *p3;
	int x,y;
	cout<<"请输入Pa表的项数:";
	cin>>x;
	CreatePolyn(Pa,x);
	cout<<"请输入Pb表的项数:";
	cin>>y;
	CreatePolyn(Pb,y);
	cout<<"联合表为:";
	AddPolyn(Pa,Pb);
	p3=Pa->next;
	while(p3){
		cout<<"p3->coef"<<p3->coef;
		cout<<"p3->expn"<<p3->expn;
		p3=p3->next;
	}
}
void CreatePolyn(Polynomial &P,int n){//输入n项的系数和指数,建立表示多项式的有序链表P
	P=new PNode;//先建立一个带头结点的单链表
	P->next=NULL;//依次输入n个非零项
	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){
//多项式加法: Pa = Pa + Pb ,利用两个多项式的结点构成"和多项式"
PNode *pl,*p2;PNode *p3;
pl = Pa -> next;p2= Pb ->next;//p1和p2初值分别指向 Pa 和 Pb 的首元结点
p3=Pa ;//p3指向和多项式的当前结点,初值为 Pa 
while (pl&&p2){//p1和p2均非空
 if (pl-> expn ==p2-> expn ){//指数相等
 int sum =pl-> coef +p2-> coef; // sum 保存两项的系数和
 if ( sum !=0){//系数和不为0
 pl -> coef = sum ;//修改 Pa 当前结点的系数值为两项系数的和
p3-> next =pl;p3=pl;//将修改后的 Pa 当前结点链在p3之后,p3指向p1
pl=pl->next;//p1指向后一项
 PNode *r =p2;p2=p2-> next; delete r;//删除 Pb 当前结点,p2指向后一项
}
else
{
PNode *r= pl; pl=pl->next; delete r ;//删除 Pa 当前结点,p1指向后一项
r =p2;p2=p2-> next ; delete r;//删除Pb当前节点,P2指向后一项
}
}
else if (pl-> expn <p2-> expn ){// Pa 当前结点的指数值小
p3-> next =pl;//将p1链在p3之后
p3=pl;//p3指向p1
pl = pl -> next ;
}//p1指向后一项
else{ // Pb 当前结点的指数值小
p3-> next =p2;//将p2链在p3之后
p3=p2;//p3指向p2
p2=p2->next;//p2指向后一项
}
}// while 
p3->next=pl?pl:p2;//插入非空多项式的剩余段
delete Pb;//释放 Pb 的头结点
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值