多项式相加减

版权声明:不得博主同意,不得转载 https://blog.csdn.net/gjs935219/article/details/83315381

单链表多项式的相加减

#include<cstdio>
#include<iostream>
using namespace std;
typedef struct pnode{
	int a;                  //系数 
	int na;                 //指数 
	struct pnode *next;   //指针域 
}pnode,*plist; 
void creatlist(plist &L,int n)
{
	plist s,pre,q,star;
	L=new pnode;
	L->next=NULL;    //先建立一个带头结点的空链表
	star=L ;        
	for(int i=1;i<=n;i++)  //输入多项式 
	{
		s=new pnode;
		cin>>s->a>>s->na;        //输入系数以及指数 
		pre=L;                   //插入s   的前驱位置 
		q=L->next;               //插入s   的后驱位置 
		while(q&&q->na<s->na)
		{
			//找出s的合适位置,使多项式有序输出 
			pre=q;
			q=q->next;
		}
		s->next=q;
		pre->next=s;
		if(s->a==0&&s->na==0)break;     //如果系数、指数为0,结束输入 
	 }
	 	star=L->next;                   //star指向链表的首元结点 
	 	
	 	/******输出写入的多项式******/ 
	while(star->next)
	{
		printf("%dx^%d+",star->a,star->na);
		star=star->next;
	} 
	printf("%dx^%d\n",star->a,star->na);
}
void dxs(plist &L1,plist &L2)
{
	//三种情况(1、合并项为0   2、L2多项式的项小于对应的L1的项    3、 L2多项式的项大于对应的L1的项 
	 plist p,p1,p2,star,c;
	 int sum;
	 p1=L1->next;
	 p2=L2->next;
	 p=L1;
	 c=L1;
	 while(p1&&p2)
	 {
	 	if(p1->na==p2->na)  //p1元素的项与p2元素对应的项相等,求和 
	 	{
	 		sum=p1->a+p2->a;
	 		if(sum!=0)       //和不为0.将和式链入合并表 ,p1\p2指向下一结点 
	 		{
	 			p1->a=sum;
	 			p->next=p1;
	 			p=p1;
	 			p1=p1->next;
	 			p2=p2->next;
			 }
			 else           //和为0. p1\p2指向下一结点 
			 if(sum==0)
			 {
			 	p1=p1->next;
			 	p2=p2->next;
			 }
		 }
		 else      //(P1多项式的项小于对应的P2的项 (把P1的这一项链入合并项,并且P1指向下一个结点) 
		 if(p1->na<p2->na)
		 {
		 	p->next=p1;
		 	p=p1;
		 	p1=p1->next;
		 }
		 else   //P1多项式的项大于对应的P2的项 (把P2的这一项链入合并项,并且P2指向下一个结点) 
		 {
		 	p->next=p2;
		 	p=p2;
		 	p2=p2->next;
		 }
	 }
	 p->next=p1?p1:p2;     //把两个多项式多余的链 链进来 
	 star=c->next;
	 /******输出合并后的多项式(注意格式,先不输出最后一项)******/
	 while(star->next)        
	 {
	 	printf("%dx^%d",star->a,star->na);  
	 	star=star->next;
	 }
	 printf("%dx^%d\n",star->a,star->na);   //最后一项 
}
int main()
{
	plist L1,L2;
	int n,m;
	printf("输入两个多项式项元素个数:");
	cin>>n>>m;
	creatlist(L1,n);
	creatlist(L2,m);
	printf("合并后为:\n");
	dxs(L1,L2);

	
}

猜你喜欢

转载自blog.csdn.net/gjs935219/article/details/83315381