//一元多项式的相加
//①判断指数是否相等,相等则系数相加指数不变
//②指数不相等的话,判断哪一个小,把小的链挂上,小的结点就被连上
//③重复此过程知道某一方完
//④将另外一方未完的链挂上
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
int data;
int pero;
struct node *next;
}ElemSN;
ElemSN *Createlink(int a[],int m)
{
ElemSN *head=NULL,*tail,*p;
for(int i=0;i<m;i=i+2){//i每次变换到新的系数部分
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];//系数
p->pero=a[i+1];//指数
p->next=NULL;
if(!head){
head=tail=p;
}
else{
tail=tail->next=p;//尾指针后移
}
}
return head;
}
void Printlink(ElemSN *head)
{
ElemSN *p;
for(p=head;p->next;p=p->next){//输出系数和指数
printf("%d^%d",p->next->data,p->next->pero);
if(p->next->next){//控制加号输出
printf("+");
}
}
}
ElemSN *Add(ElemSN *head1, ElemSN *head2)
{
ElemSN *pa,*pb,*pc,*Lc;
pa=head1;
pb=head2;
Lc=(ElemSN *)malloc(sizeof(ElemSN)); //Lc头结点
Lc->next=NULL;
pc=Lc;
while(pa&&pb)
{
if(pa->pero < pb->pero)
{
pc->next = pa; //如果指数不相等,pc指针连上指数小的结点,
pc = pa;
pa = pa->next; //指向该结点的指针后移
}
else if (pa ->pero > pb->pero )
{
pc->next = pb; //pc指针连上指数小的结点,
pc = pb;
pb = pb->next; //指向该结点的指针后移
}
else //(pa ->pero = pb->pero )
{
pa->data = pa->data + pb->data; //指数相等时,系数相加
pc->next = pa;
pc = pa;
pa = pa->next; //两指针都往后移
pb = pb->next;
}
}
pc->next = pa ? pa:pb; // 插入剩余段
return Lc;
}
int main()
{ ElemSN *head1,*head2;
head1=head2=NULL;
int m,n;
printf("Please input the m:");
scanf("%d",&m);//输入数组长度(即多项式) 数组存放的是系数和指数
int i;
int a[10];
printf("Please input a[m]:");
for(i=0;i<m;i++){//依次交替输入系数 指数
scanf("%d",&a[i]);
}
printf("Please input the n:");
scanf("%d",&n);//同上
int b[10];
printf("Please input b[n]:");
for(i=0;i<n;i++){//同上
scanf("%d",&b[i]);
}
head1=Createlink(a,m);//创建单链表 (即多项式)
printf("\n");
head2=Createlink(b,n);//同上
ElemSN *head3=NULL;
head3=Add(head1,head2);//计算多项式相加
printf("head1+head2=");
Printlink(head3);//输出多项式
return 0;
}