一元多项式相加--链表

【问题描述】

设计一个一元稀疏多项式简单计算器。

【基本要求】

一元稀疏多项式简单计算器的基本功能是:

  1. 输入并建立多项式;
  2. 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,,cn,en,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排列;
  3. 多项式a和b相加,建立多项式a+b;

【测试数据】

  1. (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7);
  2. (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5);
  3. (x+x3)+(-x-x3)=0;
  4. (x+x100)+(x100+x200)=(x+2x100+x200);
  5. (x+x2+x3)+0=(x+x2+x3);
  6. 互换上述测试数据中的前后两个多项式

代码:

#include<bits/stdc++.h>
using namespace std;
#define MAX 20  //多项式最多项数
typedef struct  //定义存放多项式的数组类型
{
	float coef;   //系数
    int exp;      //指数
}PolyArray[MAX];

typedef struct pnode  //定义单链表结点类型
{
    float coef;         //系数
    int exp;            //指数
    struct pnode *next;
}PolyNode;

void DispPoly(PolyNode *L)  //输出多项式
{
	int i=0;
	PolyNode *p=L->next;
	while (p!=NULL)
	{
		if(p->coef>0 && i!=0)
			cout << "+";
		if(p->coef!=0)
		{
			if(p->coef==1)
			{
				if(p->exp==0)
					cout << 1;
				else if(p->exp==1)
					cout << "x";
				else
					printf("x^%d",p->exp);	
			}
			if(p->coef!=1)
			{
				if(p->exp==0)
					printf("%g",p->coef);
				else if(p->exp==1)
					printf("%gx",p->coef);
				else
					printf("%gx^%d",p->coef,p->exp);	
			}
		}	
	    p=p->next;
	    i++;
	}
	if(i==0)
		cout << 0;
	cout << endl;
}

void CreateListR(PolyNode * &L,PolyArray a,int n)//尾插入法建表
{
    PolyNode *s,*r;int i;
    L=(PolyNode *)malloc(sizeof(PolyNode));//创建头结点
    L->next=NULL;
    r=L;//r始终指向终端结点,开始时指向头结点
    for(i=0;i<n;i++)
	{
		s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点
		s->coef=a[i].coef;
		s->exp=a[i].exp;
		r->next=s;//将*s插入*r之后
		r=s;
	}
    r->next=NULL;//将终端结点next域置为NULL
}

void Sort(PolyNode * &head)//按exp域的值递减排序
{
	PolyNode *p=head->next,*q,*r;
    if(p!=NULL)//当原单链表不为空时
	{
		r=p->next;//r保存*p结点后继结点的指针
	    p->next=NULL;//构造只含一个数据结点的有序表
	    p=r;
	    while(p!=NULL)
		{
			r=p->next;//r保存*p结点后继结点的指针
	        q=head;
	        while(q->next!=NULL && q->next->exp>p->exp)
	            q=q->next;//在有序表中找插入*p的前驱结点*q
	        p->next=q->next;//将*p插入到*q之后
	        q->next=p;
	        p=r;
		}
	}
}

void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)//求两个有序表的并
{
	PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
    float c;
    hc=(PolyNode *)malloc(sizeof(PolyNode));//创建头结点
    tc=hc;
    while(pa!=NULL && pb!=NULL)
	{
		if(pa->exp>pb->exp)
		{
			s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点
            s->exp=pa->exp;s->coef=pa->coef;
            tc->next=s;tc=s;
            pa=pa->next;
		}
        else if(pa->exp<pb->exp)
		{
			s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点
			s->exp=pb->exp;s->coef=pb->coef;
			tc->next=s;tc=s;
			pb=pb->next;
		}
		else
		{
			c=pa->coef+pb->coef;
			if(c!=0)//系数之和不为0时创建新结点
			{
				s=(PolyNode *)malloc(sizeof(PolyNode));   
				s->exp=pa->exp;s->coef=c;
				tc->next=s;tc=s;
    		} 
    		pa=pa->next;
    		pb=pb->next;
		}
	}
	if(pb!=NULL)//复制余下结点
		pa=pb;
	while(pa!=NULL)
	{
		s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点
		s->exp=pa->exp;s->coef=pa->coef;
    	tc->next=s;tc=s;
		pa=pa->next;
	}
	tc->next=NULL;
}

int main()
{
	PolyNode *ha,*hb,*hc;
	int m,n;
	PolyArray a,b;
	cin>>m;
	for(int i=0;i<m;i++)
		scanf("%g%d",&a[i].coef,&a[i].exp);
	cin>>n;
	for(int j=0;j<n;j++)
		scanf("%g%d",&b[j].coef,&b[j].exp); 
   CreateListR(ha,a,m);
   CreateListR(hb,b,n);
   Sort(ha);
   Sort(hb);
   Add(ha,hb,hc);
   DispPoly(hc);
   return 0;
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值