一元多项式的加减乘(C++单链表)

#include<iostream>
using namespace std; 
#include<stdlib.h>
typedef struct LNode
 {//构造结构体变量 
	int coefficient;//定义一个结构体变量“系数” 
	int exponent;//定义一个结构体变量“指数”
	struct LNode* next;
}LNode,*LinkList;
void InitList(LinkList &L)
{
	L=new LNode;//或L=(LinkList)malloc(sizeod(LNode)); 
	L->next=NULL;
}
void CreateList(LinkList &L,int n)//尾插法 
{
	int i;
	LinkList p,r;
	r=L;
	for(i=1;i<=n;i++)
	{
		p=new LNode;
		cout<<"第"<<i<<"项系数:"; 
		cin>>p->coefficient;
		cout<<"第"<<i<<"项指数:";
		cin>>p->exponent; 
		p->next=NULL;
		r->next=p;
		r=p;
	}
}
void paixu(LinkList &L)//将多项式按升幂冒泡排序
{
	LinkList p,q;
	int temp, temp1;
	for (p = L->next; p != NULL; p = p->next) //最开始p指向首元结点,每循环一次,p指向下一个结点 
	{
		for (q = p->next; q != NULL; q = q->next) //最开始q为p的后继结点,每循环一次,p指向下一个结点 
		{
			if (p->exponent > q->exponent) //如果p的指数比q的指数大,也就是前一项的指数比后一个指数大,那么交换它们的指数和系数
			{
				temp = p->exponent;
				p->exponent = q->exponent;
				q->exponent = temp;
				temp1 = p->coefficient;
	   			p->coefficient = q->coefficient;
				q->coefficient = temp1;
			}
		}
	}
}
void Merge(LinkList &L)//排序后的合并同类项 
{
	LinkList p=L,t,r=L,s;
	while(p->next)//排序后指数相同的前后两项合并
	{
		if(p->exponent==p->next->exponent){
			t=p->next;
			p->coefficient+=p->next->coefficient;
			p->next=p->next->next;
			free(t);
		}
		else{
			p=p->next;
		}
	}
	while(r->next)//合并同类项后删掉系数为0的项 
	{
		if(r->next->coefficient==0)
		{
			s=r->next;
			r->next=s->next;
			delete s;
			r=r->next; 
		}
		else r=r->next;
	}
}
void PrintList(LinkList L)
{
	paixu(L);
	Merge(L); 
	LinkList p;
	p=L->next;
	if(p->exponent==0)//如果第一项指数为0 ,只输出系数 
	    cout<<p->coefficient;
	else//第一项指数不为0 
	   cout<<p->coefficient<<"x^("<<p->exponent<<")";
    p=p->next;
	while(p)
	{
		if(p->exponent==0)
		    cout<<p->coefficient;
		else
		{
			if(p->coefficient>0)
			{
				cout<<"+"<<p->coefficient<<"x^("<<p->exponent<<")";
			}
			if(p->coefficient<0)
			{
				cout<<p->coefficient<<"x^("<<p->exponent<<")";
			}
		}
		p=p->next;
	}
}
void Add(LinkList La,LinkList Lb,LinkList &L1)
{
	LinkList a,b,r,p;
	a=La->next;b=Lb->next;r=L1;
	while(b!=NULL)//把Lb接在L2上
	{
		p=new LNode;
		p->coefficient=b->coefficient;
		p->exponent=b->exponent; 
		p->next=r->next;
		r->next=p;
		r=r->next;
		b=b->next;
	}
	while(a!=NULL)//再接上La 
	{
		p=new LNode;
		p->coefficient=a->coefficient;
		p->exponent=a->exponent; 
		p->next=r->next;
		r->next=p;
		r=r->next;
		a=a->next;
	}
	paixu(L1); 
	Merge(L1);//排序后的合并同类项 
	PrintList(L1);
}
void Sub(LinkList La,LinkList Lb,LinkList &L2)
{
	LinkList a,b,p,r;
	a=La->next;b=Lb->next;r=L2;
	while(b!=NULL)//把Lb的系数全变为相反数接在L2上 
	{
		p=new LNode;
		p->coefficient=0-(b->coefficient);
		p->exponent=b->exponent; 
		p->next=r->next;
		r->next=p;
		r=r->next;
		b=b->next;
	}
	while(a!=NULL)//再接上La 
	{
		p=new LNode;
		p->coefficient=a->coefficient;
		p->exponent=a->exponent; 
		p->next=r->next;
		r->next=p;
		r=r->next;
		a=a->next;
	} 
	paixu(L2); 
	Merge(L2);//排序后的合并同类项 
	PrintList(L2);
}
void Mult(LinkList La,LinkList Lb,LinkList &L3) 
{
	LinkList a,b,p,r;
	a=La->next;b=Lb->next;r=L3;
	while(a!=NULL)//遍历F1的每一项
	{
		while(b!=NULL)//遍历F2的每一项
		{
			p=new LNode;
			p->coefficient=a->coefficient*b->coefficient;
			p->exponent=a->exponent+b->exponent;
			p->next=r->next;
			r->next=p;
			r=r->next;
			b=b->next;
		}
		a=a->next;b=Lb->next;
	}
	paixu(L3); 
	Merge(L3);//排序后的合并同类项 
	PrintList(L3);
}
int main()
{
	int m,n;
	LinkList La,Lb,L1,L2,L3,L4;
	InitList(La);
	InitList(Lb);
	InitList(L1);
	InitList(L2);
	InitList(L3);
	InitList(L4);
	cout<<"F1有几项:";
	cin>>m;
	CreateList(La,m);
	cout<<"F1:";
	PrintList(La);
	cout<<endl<<"F2有几项:";
	cin>>n;
	CreateList(Lb,n);
	cout<<"F2:";
	PrintList(Lb);
	cout<<endl<<"F1+F2=";
	Add(La,Lb,L1);
	cout<<endl<<"F1-F2=";
	Sub(La,Lb,L2);
	cout<<endl<<"F1*F2=";
	Mult(La,Lb,L3);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值