单链表多项式的相加减
#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);
}