两个多项式相加

编写将两个多项式相加的函数。不要毁坏输入数据。如果这两个多项式分别有M项和N项,那么你的程序的复杂度是多少。

#include <stdio.h>
#include <stdlib.h>
struct poly_list;
typedef struct poly_list *Poly;
typedef struct poly_list *Position;
struct poly_list
{
    int coef;
    int Exp;
    Position next;
};
//create
Poly Create()
{
  Poly p=malloc(sizeof(struct poly_list));
  p->coef=-1;
  p->Exp=-1;
  p->next=NULL;
  return p;
}
//insert
void Insert(int coeff,int exponent,Poly p_root)
{
    Position p=p_root;
   while(p->next!=NULL)
   {
     p=p->next;
   }
    Position p_tem=malloc(sizeof(struct poly_list));
    p_tem->coef=coeff;
    p_tem->Exp=exponent;
    p_tem->next=p->next;
    p->next=p_tem;
}
void traverse(Poly p_root)
{
    if(p_root->next==NULL)
        printf("error ,the list is empty\n");
    else
    {
        Position p_tem=p_root->next;
        while(p_tem!=NULL)
        {
            printf("(%d,%d)\n",p_tem->coef,p_tem->Exp);
            p_tem=p_tem->next;
        }
    }
}
Poly Add(Poly p_1,Poly p_2)
{
    if(p_1->next==NULL&&p_2->next!=NULL)
        return p_2;
    if(p_1->next!=NULL&&p_2->next==NULL)
        return p_1;
    if(p_1->next==NULL&&p_2->next==NULL)
        return NULL;
    if(p_1->next!=NULL&&p_2->next!=NULL)
    {
        Poly p_3=Create();
        Position p1_tem=p_1->next;
        Position p2_tem=p_2->next;
        int p1_exp;
        int p2_exp;
        while(p1_tem!=NULL)
        {
            p1_exp=p1_tem->Exp;
            while(p2_tem!=NULL)
            {
                p2_exp=p2_tem->Exp;
                if(p1_exp==p2_exp)
                {
                    Insert(p1_tem->coef+p2_tem->coef,p1_exp,p_3);
                    p2_tem=p2_tem->next;
                    p1_tem=p1_tem->next;
                    break;
                }
                if(p1_exp<p2_exp)
                {
                    Insert(p2_tem->coef,p2_exp,p_3);
                    p2_tem=p2_tem->next;
                }
                if(p1_exp>p2_exp)
                {
                    Insert(p1_tem->coef,p1_exp,p_3);
                    p1_tem=p1_tem->next;
                    break;
                }
            }
            if(p2_tem==NULL)
                break;
       }
       while(p1_tem!=NULL)
       {
            Insert(p1_tem->coef,p1_exp,p_3);
            p1_tem=p1_tem->next;
       }
       while(p2_tem!=NULL)
       {
            Insert(p2_tem->coef,p2_tem->Exp,p_3);
            p2_tem=p2_tem->next;
       }
    return p_3;
    }
}
int main()
{
Poly p_root1=Create();
Insert(10,1000,p_root1);
Insert(5,14,p_root1);
Insert(1,0,p_root1);
Poly p_root2=Create();
Insert(3,1990,p_root2);
Insert(-2,1492,p_root2);
Insert(11,1,p_root2);
Insert(5,0,p_root2);
Poly p_root3=Add(p_root1,p_root2);
traverse(p_root3);
return 0;
}

复杂度为O(m+n);
习题二(栈)待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值