7.一元多项式相加

成绩10开启时间2021年09月17日 星期五 00:00
折扣0.8折扣时间2021年09月30日 星期四 23:55
允许迟交关闭时间2021年10月10日 星期日 23:55

题目说明:

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

1. 多项式求和

输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc

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

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

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

0. 退出

输入:

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

  • 1

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

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

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

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

输出:

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

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

  • 0 无输出
测试输入期待的输出时间限制内存限制额外进程
测试用例 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秒1024KB0
测试用例 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秒1024KB0
测试用例 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秒1024KB0

代码

怎么说呢,我被恶心到了,debug了一晚上,感觉自己写的跟学长的差不多,但就是出各种问题,比如没结果、比如多项式多了一项地址项……我被整麻了,感觉和学长写的区别比较大的一点就是学长把头结点置空,从下一个结点开始遍历,而我是直接从头结点遍历的,但我觉得这也不是什么大的区别吧,但就是过不了……

所以这一篇只有AC代码,原理题干已经说了,这题原理还是很好理解的,就不多赘述了

#include"stdio.h"  
#include"stdlib.h"  
  
typedef struct a{  
    int di;  
    int mi;  
    struct a *next;  
}a,*linka;  
  
void create(linka &h){  
    int n;  
    scanf("%d",&n);  
      
    linka p;  
    h=(linka)malloc(sizeof(linka));  
    p=h;  
      
    int i;  
    int a,b;  
    for(i=0;i<n;i++){  
        scanf("%d %d",&a,&b);  
          
        p->next=(linka)malloc(sizeof(linka));  
        p=p->next;  
        p->di=a;  
        p->mi=b;  
          
    }  
      
    p->next=NULL;  
      
}   
  
void print(linka &head){  
    linka p;  
    p=head->next;  
      
    if(p==NULL){  
        printf("<0,0>\n");  
        return;  
    }  
      
    else{  
        printf("<%d,%d>",p->di,p->mi);  
        p=p->next;  
    }  
      
    while(p){  
        printf(",<%d,%d>",p->di,p->mi);  
        p=p->next;  
    }  
      
    printf("\n");  
      
}  
  
void add(linka &la,linka &lb){  
    int sum=0;  
    linka a,b;  
    a=la->next;  
    b=lb->next;  
      
    linka cur,q;  
    cur=la;  
      
    while(a!=NULL&&b!=NULL){  
        if(a->mi<b->mi){  
            cur=a;  
            a=a->next;  
        }  
          
        else if(a->mi==b->mi){  
            sum=a->di+b->di;  
            if(sum==0){  
                q=a->next;  
                free(a);  
                a=q;  
                cur->next=q;  
            }  
              
            else{  
                a->di=sum;  
                cur=a;  
                a=a->next;  
            }  
              
            q=b;  
            b=b->next;  
            free(q);  
              
        }  
          
        else{  
            q=b->next;  
            b->next=a;  
            cur->next=b;  
            cur=b;  
            b=q;  
        }  
    }  
    if(b){  
        cur->next=b;  
    }  
}  
  
int main()    
{    
    int N;      
    while(scanf("%d",&N)!=EOF)    
    {    
        if(N==0)    
            break;    
        linka pa,pb,pc;    
        create(pa);    
        create(pb);    
        create(pc);    
        print(pa);    
        print(pb);    
        print(pc);    
        add(pa,pb);    
        print(pa);    
        add(pa,pc);    
        print(pa);    
    }    
    return 0;    
} 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值