1467 数据结构:一元多项式加法

数据结构:一元多项式加法
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Description


给定2个一元多项式,计算它们的和。例如:f(x)=5x3-3x2+1和g(x)=3x4+3x2+x,则h(x)=f(x)+g(x)=3x4+5x3+x+1。

Input

只有一个测试案例,输入包括2行。
第1行为多项式f(x)的项数n和n项的系数和次方(按照次方从大到小)。第2行为多项式g(x)的项数m和m项的系数和次方(按照次方从大到小)。
其中:0<m,n<100

Output

多项式h(x)每项的系数和次方(按照次方从大到小)。

Sample Input
3 5 3 -3 2 1 0
3 3 4 3 2 1 1
Sample Output
3 4 5 3 1 1 1 0

AC代码:

#include<stdlib.h>
typedef struct term
{   
 int coef;  
 int expn;   
}term;   
typedef struct LNode  
{
 term data;
 struct  LNode *next;
}LNode,*Polynomial;

int equal(int e1,int e2){
  
 if(e1==e2) return 1;
 return 0; 
}

int LocateElem(Polynomial p1,Polynomial r1,int (*cmp)(int,int))
{
 Polynomial q;  
   q=p1->next;   
 while(q)     
 {
   if((*cmp)((q->data).expn,(r1->data).expn)) 
   break;    
  q=q->next; 
 }
 if(q)   
  {
     (q->data).coef=(r1->data).coef+(q->data).coef;
   
  return 1;
  }
 else   
     return 0; 
}

void Inpolyn(Polynomial &p,Polynomial &r)
{
 
  Polynomial q;
  q=p;
  while(q->next&&(q->next->data).expn>(r->data).expn)
  q=q->next;
  r->next=q->next;
  q->next=r;
}

void CreatPolyn(Polynomial &p,int m)
{ 
 p=(Polynomial)malloc(sizeof(LNode));
    
 (p->data).coef=0;  
 (p->data).expn=-1;  
 p->next=NULL;
    Polynomial r,q;  
 q=p;      
 int i;
 for(i=1;i<=m;i++)
 {
  r=(Polynomial)malloc(sizeof(LNode));
  scanf("%d%d",&(r->data).coef,&(r->data).expn);
  if(!LocateElem(p,r,equal))   
   Inpolyn(p,r);
 }
}
void AddPolyn(Polynomial &pa,Polynomial &pb,Polynomial &pc){
  
 pc=(Polynomial)malloc(sizeof(LNode)); 
      
   (pc->data).coef=0;(pc->data).expn=-1;pc->next=NULL;
   
    Polynomial p1,p2,p3,de;  
    p1=pa->next;
    p2=pb->next;
     p3=pc;      
    free(pa);free(pb);
    while(p1&&p2)   
    {
     if((p1->data).expn==(p2->data).expn)
    {   
     (p1->data).coef+=(p2->data).coef;
             
       if((p1->data).coef)
     {
         
      p3->next=p1;
      
      p3=p1;
      p1=p1->next;
      de=p2;
       
      p2=p2->next; 
       free(de);
       }
       else 
       {  
         de=p1;
       p1=p1->next;
       free(de);
       de=p2;
       p2=p2->next;
       free(de);  
       }
       } 
    else if((p1->data).expn>(p2->data).expn)
 {       
  p3->next=p1;
  p3=p1;
  p1=p1->next; 
 } 
 else 
 {
  p3->next=p2;
  p3=p2;
  p2=p2->next; 
 }
    }
    if(p1) 
      p3->next=p1;
    if(p2)
      p3->next=p2;
}
int main()
{
  Polynomial  ha,hb,hc,th;
  int t1,t2;

   scanf("%d",&t1);
   CreatPolyn(ha,t1); 
   scanf("%d",&t2);
   CreatPolyn(hb,t2);
   AddPolyn(ha,hb,hc);
   th=hc->next;
 
 while(th->next)
 {
   printf("%d %d ",(th->data).coef,(th->data).expn);
   th=th->next;
 }
  printf("%d %d\n",(th->data).coef,(th->data).expn);
 return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值