一元多项式的相加(两个)

#include<stdio.h>
#include<malloc.h>

typedef struct StudentType
{
 int a,z;
 struct StudentType *next,*prior;
}*Linklist,List;

Linklist Build(int n)
{
 int i=n;
 Linklist head=NULL,p=NULL,ptr=NULL;
 head=(Linklist)malloc(sizeof(List));
 head->next=NULL;
 ptr=head;
 for(i=0;i<n;i++)
 {
  p=(Linklist)malloc(sizeof(List));
  printf("指数,系数\n");
  scanf("%d%d",&p->z,&p->a);
  ptr->next=p;
  p->prior=ptr;
  ptr=p;
 }
 head->prior=p;
 p->next=head;
 return head;
}

Linklist Link(Linklist a,Linklist b)
{
 Linklist heada=a->next,headb=b->next,temp=NULL;
 Linklist head=a,ptr=head;
 while(heada->next!=a->next && headb->next!=b->next)
 {
       if(heada->z==headb->z)
       {
            heada->a+=headb->a;
        ptr->next=heada;
        heada->prior=ptr;
           ptr=heada;
           heada=heada->next;
           headb=headb->next; 
   
       }
   else if(heada->z < headb->z)
   {
        temp=heada;
        while(temp->z!=headb->z && temp->next!=a->next)
        {
             temp=temp->next;
        }
        if(temp->next==a->next)
        {
             while(heada->z < headb->z&&heada->next!=a->next )
             {
                 ptr->next=heada;
                 heada->prior=ptr;
                 ptr=heada;
                 heada=heada->next;
             }
             ptr->next=headb;
             headb->prior=ptr;
             ptr=headb;
             headb=headb->next;
        }
        else
        {
             headb->a+=temp->a;

             while(heada!=temp)
             {
                 ptr->next=heada;
                 heada->prior=ptr;
                 ptr=heada;
                 heada=heada->next;
             }
             ptr->next=headb;
             headb->prior=ptr;
             ptr=headb;
             heada=temp->next;
             headb=headb->next;
            }
  
   }
   else 
   {
        temp=headb;
        while(temp->z!=heada->z && temp->next!=b->next)
        {
             temp=temp->next;
        }
        if(temp->next==b->next)
        {
             while(headb->z < heada->z && headb->next!=b->next)
             {
                 ptr->next=headb;
                 headb->prior=ptr;
                 ptr=headb;
                 headb=headb->next;
             }
             ptr->next=heada;
             heada->prior=ptr;
             ptr=heada;
             heada=heada->next;
    
            }
        else
        {
             heada->a+=temp->a;
            while(headb!=temp)
            {
                ptr->next=headb;
                headb->prior=ptr;
                ptr=headb;
                headb=headb->next;
            }
             ptr->next=heada;
             heada->prior=ptr;
             ptr=heada;
             heada=heada->next;
             headb=temp->next;
         
            }
   }

 }
 if(heada->next!=a->next)
 {
    while(heada!=a)
    {
        ptr->next=heada;
        heada->prior=ptr;
        ptr=heada;
        heada=heada->next;
    }
 }
 if(headb->next!=b->next)
 {
      while(headb!=b)
    {
        ptr->next=headb;
        headb->prior=ptr;
        ptr=headb;
        headb=headb->next;
    
    }
 }
 ptr->next=head;
 head->prior=ptr;
 return head;

}
void Print(Linklist head)
{
 Linklist ptr=head->next;
 while(ptr->next!=head->next)
 {
  printf("aaaaaaaaaaa指数,系数\n");
  printf("%d %d\n",ptr->z,ptr->a);
  ptr=ptr->next;
 }
}

int main()
{
 int a,b;
 printf("输入多项式的元素个数\n");
 scanf("%d%d",&a,&b);
 Linklist heada=Build(a);
 Linklist headb=Build(b);
 Linklist headTotal=Link(heada,headb);
 Print(headTotal);

 return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值