链表:多项式的运算(相加、相减)

//实现多项式的运算 
#include<iostream>

using namespace std;

typedef struct PNode{
	float coef;			//系数 
	int expn;			//指数 
	struct PNode *next;
}PNode,*Polyn;

//创建多项式  实现链表递增 
void CreatePolyn(Polyn &L,int n)
{
	L=new PNode;		//创建带有头结点的空链表
	L->next=NULL;
	for(int i=0;i<n;i++)
	{
		Polyn s=new PNode;
		cout << "请输入第" << i+1 << "个系数和指数(中间用空格隔开):";
		cin >> s->coef >> s->expn;		
		PNode *pre,*q;
		pre=L;			//pre指向待找结点前驱 
		q=L->next;		//q指向待找结点 
		while(q&&q->expn < s->expn)
		{
			pre=q;
			q=q->next;
		}
		//然后把s插入到pre和q中间
		s->next=q;
		pre->next=s;
	}
}

//遍历取值 
void T_GetElem(Polyn L)
{
	PNode *p;
	p=L->next;
	while(p)
	{
		cout << p->coef << " " << p->expn << endl;
		p=p->next;
	}
}

//多项式相加
void AddPolyn(Polyn &A,Polyn &B)
{
	PNode *p1,*p2,*p3;
	p1=A->next;p2=B->next;
	p3=A;	
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sum=p1->coef+p2->coef;
			//如果和等于0  销毁p1 p2 
			//否则 销毁p2,改变p1的指数值 
			if(sum==0)
			{
				PNode *r=p1;p1=p1->next;delete r;
				PNode *w=p2;p2=p2->next;delete w;
			}
			else
			{
				p1->coef=sum;
				PNode *r=p2;p2=p2->next;delete r;
				//把p1链在p3之后,再更新p3 
				p3->next=p1;
				p3=p1;
				p1=p1->next;
			}
		}
		else if(p1->expn<p2->expn)
		{
			//链p1  p1指向下一个结点 
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		} 
		else
		{
			//链p2 
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	p3->next=p1?p1:p2;
	delete B;		//销毁B的表头 
} 

//A-B
void SubPolyn(Polyn &A,Polyn &B)
{
	PNode *p1,*p2,*p3;
	p1=A->next;p2=B->next;
	p3=A;
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sub=p1->coef-p2->coef;
			if(sub==0)
			{
				PNode *r=p1;p1=p1->next;delete r;
				PNode *w=p2;p2=p2->next;delete w;
			}
			else 
			{
				p1->coef=sub;
				p3->next=p1;
				p3=p1;
				p1=p1->next;
				PNode *r=p2;
				p2=p2->next;
				delete r;
			}
		}
		else if(p1->expn < p2->expn)
		{
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		}
		else 
		{
			p2->coef=-p2->coef;
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	if(!p1)
	{
		p3->next=p2;
		p3=p2;
		while(p3)
		{
			p3->coef=-p3->coef;
			p3=p3->next;
		}
	}
	else if(!p2)
	{
		p3->next=p1;
	}
	delete B;
}

int main()
{
	Polyn PA,PB;
	int n;
	cout << "输入多项式 PA 的项数 :" ;
	cin >> n;
	CreatePolyn(PA,n);
	cout << "多项式PA的各个系数:\n";
	T_GetElem(PA);
	cout << "------------------------\n";
	cout << "输入多项式 PB 的项数 :" ;
	cin >> n;
	CreatePolyn(PB,n);
	cout << "多项式PB的各个系数:\n";
	T_GetElem(PB);
	cout << "------------------------\n";
	cout << "现在你可以做一个选择:\n";
	cout << "1、PA+PB\n2、PA-PB\n3、PB-PA\n0、退出程序\n";
	cin >> n;
	switch(n)
	{
		case 1:
			AddPolyn(PA,PB);
			cout << "相加后的各项:\n";
			T_GetElem(PA);
			break;
		case 2:
			cout << "PA-PB后的各项:\n";
			SubPolyn(PA,PB);
			T_GetElem(PA);
			break;
		case 3:
			cout << "PB-PA后的各项:\n";
			SubPolyn(PB,PA);
			T_GetElem(PB);
			break;
		case 0:
			exit(0);
	} 
	return 0;
}

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一元多项式相加相减运算可以使用上面的链表实现。假设有两个多项式 $p_1$ 和 $p_2$,它们的单项式按照指数从大到小排列,可以按照以下方式实现相加相减运算: ```python def add(p1, p2): result = Polynomial() current_p1 = p1.head.next current_p2 = p2.head.next while current_p1 is not None and current_p2 is not None: if current_p1.exp == current_p2.exp: result.insert(current_p1.coef + current_p2.coef, current_p1.exp) current_p1 = current_p1.next current_p2 = current_p2.next elif current_p1.exp > current_p2.exp: result.insert(current_p1.coef, current_p1.exp) current_p1 = current_p1.next else: result.insert(current_p2.coef, current_p2.exp) current_p2 = current_p2.next while current_p1 is not None: result.insert(current_p1.coef, current_p1.exp) current_p1 = current_p1.next while current_p2 is not None: result.insert(current_p2.coef, current_p2.exp) current_p2 = current_p2.next return result def sub(p1, p2): result = Polynomial() current_p1 = p1.head.next current_p2 = p2.head.next while current_p1 is not None and current_p2 is not None: if current_p1.exp == current_p2.exp: result.insert(current_p1.coef - current_p2.coef, current_p1.exp) current_p1 = current_p1.next current_p2 = current_p2.next elif current_p1.exp > current_p2.exp: result.insert(current_p1.coef, current_p1.exp) current_p1 = current_p1.next else: result.insert(-current_p2.coef, current_p2.exp) current_p2 = current_p2.next while current_p1 is not None: result.insert(current_p1.coef, current_p1.exp) current_p1 = current_p1.next while current_p2 is not None: result.insert(-current_p2.coef, current_p2.exp) current_p2 = current_p2.next return result ``` 以上代码中,`add` 函数和 `sub` 函数分别实现了多项式的加法和减法,返回一个多项式。在循环中,比较两个多项式当前单项式的指数大小,如果相同则将系数相加(或相减),否则插入指数较大的单项式。最后,如果有一个多项式已经遍历完,则将另一个多项式的剩余单项式全部插入到结果多项式中。 使用示例: ```python p1 = Polynomial() # 2x^3+3x^2-4x+1 p1.insert(2, 3) p1.insert(3, 2) p1.insert(-4, 1) p1.insert(1, 0) p2 = Polynomial() # -x^2+2x+1 p2.insert(-1, 2) p2.insert(2, 1) p2.insert(1, 0) p3 = add(p1, p2) # 2x^3+2x^2-2x+2 print(p3) # 2x^3+2x^2-2x+2 p4 = sub(p1, p2) # 2x^3+4x^2-6x print(p4) # 2x^3+4x^2-6x ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值