多项式的加法乘法实现

1多项式的表示  2程序框架          3读多项式           4加法实现            5乘法实现             6输出多项式

程序代码如下:

#include<stdio.h>
#include<stdlib.h>
/*  定义结构,但是更推荐这种定义
  typedef struct PolyNode{
      int coef;
      int expon;
      struct PolyNode *Next;
  }*PolyNode;                      */
typedef struct PolyNode *Polynomial ;
struct PolyNode
{
    int coef;
    int expon;
    Polynomial Next;
};
/*连接函数,通过参数的传递,构成链表,注意*rear是指针的指针,故能修改rear的地址(值)*/
void Attach(int coef,int expon,Polynomial *rear)
{
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=coef;
    P->expon=expon;
    P->Next=NULL;
    (*rear)->Next=P;
    (*rear)=P;
}
   /* 读入数据函数*/
Polynomial ReadPoly()
{
    int N;
    int coef,expon;
    Polynomial P,rear,t;
    P=(Polynomial)malloc(sizeof(struct PolyNode));   //采用开头构造空节点P的方法
    P->Next=NULL;
    rear=P;
    scanf("%d",&N);
    while(N--)
    {
        scanf("%d %d",&coef,&expon);
        Attach(coef,expon,&rear);
    }
    t=P;
    P=P->Next;
    free(t);   //将空节点删除
    return P;
}
    /* 加法的实现函数 */
Polynomial Add(Polynomial P1,Polynomial P2)
{
    Polynomial P,rear,t;
    P=(Polynomial)malloc(sizeof(struct PolyNode));   //创建空节点
    P->Next=NULL;
    rear=P;   //  rear 指向P
    int sum;
    while(P1 && P2)
    {
        if (P1->expon>P2->expon)                //按指数递减的顺序排列
        {
            Attach(P1->coef,P1->expon,&rear);   //拷贝P1,P1后移,依次类推
            P1=P1->Next;
        }
       else if (P1->expon<P2->expon)
        {
            Attach(P2->coef,P2->expon,&rear);
            P2=P2->Next;
        }
        else
        {
            sum=P1->coef+P2->coef;
           if (sum) Attach(sum,P1->expon,&rear);  //系数之和不为0才拷贝,P1,P2同时后移
            P1=P1->Next;
            P2=P2->Next;
        }
    }
    while (P1){Attach(P1->coef,P1->expon,&rear);P1=P1->Next;}  //继续将剩下的拷贝过去
    while (P2){Attach(P2->coef,P2->expon,&rear);P2=P2->Next;}
    t=P;
    P=P->Next;
    free(t);   //释放空的头节点
    return P;
}
     /* 乘法实现的函数 */
Polynomial Mult(Polynomial P1,Polynomial P2)
{
    Polynomial P,rear,t1,t2,t;
    int c,e;
    if (!P1 || !P2)  return NULL;
    t1 = P1;
    t2 = P2;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->Next = NULL;
    rear = P;
    while(t2)   //先得出一个链表,即P1的第一项分别和P2的每一项相乘
    {
        Attach(t1->coef * t2->coef,t1->expon + t2->expon,&rear);
        t2 = t2->Next;
    }
    t1=t1->Next;
    while (t1)    //将每一项结果和原始链表对比,对原始链表进行增,改,删等操作
   {
        t2 = P2;
        rear = P;
         while(t2)
          {
            e = t1->expon + t2->expon;
            c = t1->coef * t2->coef;
            while(rear->Next && rear->Next->expon>e )rear=rear->Next;  //!!!一定注意&&前后表达式顺序不能反!
            if (rear->Next && rear->Next->expon==e)
            {
                if(rear->Next->coef+c)rear->Next->coef+=c;
                else{t=rear->Next;rear->Next=t->Next;free(t);}//删除该节点
            }
            else  //<e, 在rear后插入一个新的节点
            {
                t=(Polynomial)malloc(sizeof(struct PolyNode));
                t->coef=c;
                t->expon=e;
                t->Next=rear->Next;
                rear->Next=t;
                rear=rear->Next;
            }
            t2=t2->Next;
       }
         t1=t1->Next;
  }
    t=P;
    P=P->Next;
    free(t);  //释放空的头节点
    return P;
}
/* 输出函数 */
void PrintPoly(Polynomial P)
{
    int flag=0;
    if(!P){printf("0 0\n");return;}
    while(P)
   {
       if (!flag)flag=1;   //符合题目要求格式,即结尾没有空格
       else printf(" ");
       printf("%d %d",P->coef,P->expon);
       P=P->Next;
   }
   printf("\n");
}
int main()
{
  Polynomial P1,P2,PP,PS;
  P1=ReadPoly();
  P2=ReadPoly();
  PP=Mult(P1,P2);
  PrintPoly(PP);
  PS=Add(P1,P2);
  PrintPoly(PS);
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值