一元多项式相加

成绩 10 开启时间 2017年09月27日 星期三 00:00
折扣 0.8 折扣时间 2017年10月20日 星期五 23:55
允许迟交 关闭时间 2018年01月8日 星期一 23:55

题目说明:

编写一元多项式加法运算程序。要求用线性链表存储一元多项式(参照课本)。该程序有以下几个功能:

1. 多项式求和

输入:输入三个多项式,建立三个多项式链表PaPbPc

(提示:调用CreatePolyn(polynomial &P,int m)

输出:显示三个输入多项式PaPbPc、和多项式Pa+Pb、多项式Pa+Pb+Pc

(提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))

0. 退出

输入:

根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):

  • 1

多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)

多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)

多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)

  • ---操作终止,退出。

输出:

对应一组输入,输出一次操作的结果(参见测试用例)。

  • 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。零多项式的输出格式为<0,0>

  • 无输出

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 1↵
  2. 2↵
  3. 1 1 2 2↵
  4. 2↵
  5. 1 1 2 2↵
  6. 2↵
  7. 1 1 2 2↵
以文本方式显示
  1. <1,1>,<2,2>↵
  2. <1,1>,<2,2>↵
  3. <1,1>,<2,2>↵
  4. <2,1>,<4,2>↵
  5. <3,1>,<6,2>↵
1秒 1024KB 0
测试用例 2 以文本方式显示
  1. 1↵
  2. 2↵
  3. 6 3 8 6↵
  4. 2↵
  5. 3 4 4 8↵
  6. 3↵
  7. 1 1 5 5 9 9↵
以文本方式显示
  1. <6,3>,<8,6>↵
  2. <3,4>,<4,8>↵
  3. <1,1>,<5,5>,<9,9>↵
  4. <6,3>,<3,4>,<8,6>,<4,8>↵
  5. <1,1>,<6,3>,<3,4>,<5,5>,<8,6>,<4,8>,<9,9>↵
1秒 1024KB 0
测试用例 3 以文本方式显示
  1. 1↵
  2. 2↵
  3. 1 1 2 2↵
  4. 2↵
  5. -1 1 -2 2↵
  6. 2↵
  7. 1 1 2 2↵
以文本方式显示
  1. <1,1>,<2,2>↵
  2. <-1,1>,<-2,2>↵
  3. <1,1>,<2,2>↵
  4. <0,0>↵
  5. <1,1>,<2,2>↵
1秒 1024KB 0

#include<stdio.h> 
#include<stdlib.h> 
#define LEN sizeof(struct node) 
typedef struct node 
{ 
 int coef; 
  int exp; 
   struct node *next; 
}*polynomial, Polynomial; 
 
CreatePolyn(polynomial P, int m) 
{ 
   polynomial p1=P; 
   for (int i = 0; i < m; i++) 
 { 
      polynomial pnew = (polynomial)malloc(LEN); 
     scanf("%d %d", &pnew->coef, &pnew->exp); 
     p1->next = pnew; 
        p1 = pnew; 
 } 
  p1->next = NULL; 
} 
 
 
PrintPolyn(polynomial P) 
{ 
 polynomial tmp = P->next; 
   if (tmp== NULL) 
    { 
      printf("<0,0>\n"); 
   } 
  else 
   { 
      while (tmp->next) 
       { 
          printf("<%d,%d>,", tmp->coef, tmp->exp); 
           tmp = tmp->next; 
        } 
      printf("<%d,%d>\n", tmp->coef, tmp->exp); 
  } 
} 
 
AddPolyn(polynomial Pa, polynomial Pb) 
{ 
  polynomial ha = Pa, hb = Pb, qa = ha->next, qb = hb->next; int a, b; 
 while (qa&&qb) 
 { 
      a = qa->exp, b = qb->exp; 
        if (a < b) 
      { 
          ha = qa; qa = qa->next; 
     } 
      else if (a == b) 
       { 
          int sum = qa->coef+ qb->coef; 
            if (sum != 0) 
          { 
              qa->coef = sum; ha = qa; 
            } 
          else 
           { 
              ha->next = qa->next; free(qa); 
           } 
          hb->next = qb->next; free(qb); qb = hb->next; qa = ha->next; 
       } 
      else if (a>b) 
       { 
          hb->next = qb->next;  
            ha->next = qb;  
         qb->next = qa;  
         qb = hb->next;  
         ha = ha->next; 
      } 
  } 
  if (qb != NULL) 
    { 
 
     while (qb != NULL) 
     { 
          polynomial pnew = (polynomial)malloc(LEN); 
         pnew->coef = qb->coef; 
           pnew->exp = qb->exp; 
         pnew->next = NULL; 
          ha->next = pnew; 
            ha = ha->next; 
          qb = qb->next; 
      } 
  } 
} 
 
int main() 
{ 
  //freopen("5.txt", "r", stdin); 
    int cmd; int num; 
  while (scanf("%d", &cmd) != EOF) 
   { 
      if (cmd == 0) 
          break; 
     Polynomial pa, pb, pc; 
     pa.next = NULL, pb.next = NULL, pc.next = NULL; 
        scanf("%d", &num); CreatePolyn(&pa, num); 
      scanf("%d", &num); CreatePolyn(&pb, num); 
      scanf("%d", &num); CreatePolyn(&pc, num); 
      PrintPolyn(&pa); PrintPolyn(&pb); PrintPolyn(&pc); 
     AddPolyn(&pa,&pb); 
     PrintPolyn(&pa); 
       AddPolyn(&pa, &pc); 
        PrintPolyn(&pa); 
   } 
  return 0; 
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值