2-一元多项式的加法

采用链表的结构存储一元多项式

  

那么到底存储什么呢???

  存指数、系数

  通过给链表设置三个数据域,一个指数域、一个系数域、一个指针域,这就可以表示一元多项式的一项了

  然后让链表按照指数递减的顺序存储

  y=3x^5+4x^4-2x就是这个样子的了

  

那么怎么求   y=3x^5+4x^4-x^3+2x-1   +   y=2x^4+x^3-7x^2+x  的结果呢???

Input

  5

  3 5

  4 4

  -1 3

  2 1

  -1 0

  4

  2 4

  1 3

  -7 2

  1 1

Output

  3 5

  6 4

  -7 2

  3 1

  -1 0

 输入的第1行为多项式的项数,剩下的n行为多项式各项的系数和指数

  1 //一元多项式加法
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <stdbool.h> 
  6 
  7 typedef struct LNode *Link;
  8 struct LNode{
  9     int coef;    //系数 
 10     int expon;    //指数
 11     Link next;  //指向下一个节点的指针 
 12 };
 13 
 14 
 15 Link Read(){
 16     int num,i;
 17     Link L,T,P;
 18     L=(Link)malloc(sizeof(struct LNode));
 19     scanf("%d",&num);     //读入多项式的个数 
 20     scanf("%d %d",&L->coef,&L->expon);        //第一个多项式的值 
 21     L->next=NULL;
 22     T=L;
 23     for(i=0;i<num-1;i++){
 24         P=(Link)malloc(sizeof(struct LNode));
 25         scanf("%d %d",&P->coef,&P->expon);
 26         P->next=NULL;
 27         T->next=P;
 28         T=P;
 29     }
 30     
 31     return L;  //返回多项式的头结点 
 32 }
 33 
 34 Link Add(Link L1,Link L2){      
 35     Link Front,Rear,Temp;  
 36     int sum; 
 37     Rear=(Link)malloc(sizeof(struct LNode));  //创建一个空节点 
 38     Front=Rear;
 39     
 40     while(L1 && L2){
 41         if(L1->expon>L2->expon){    //L1的指数大于L2的指数 
 42             Attach(L1->coef,L1->expon,&Rear);
 43             L1=L1->next;
 44         }else if(L1->expon<L2->expon){     //L1的指数小于L2的指数 
 45             Attach(L2->coef,L2->expon,&Rear);
 46             L2=L2->next;
 47         }else{          //相等;但是要注意的是要查看系数是否等于0 
 48             sum=L1->coef+L2->coef;
 49             if(sum){
 50                 Attach(sum,L1->expon,&Rear);
 51             } 
 52             L1=L1->next;
 53             L2=L2->next;
 54         }                
 55     }
 56     
 57     while(L1){      //L1还有节点 
 58         Attach(L1->coef,L1->expon,&Rear);
 59         L1=L1->next;
 60     } 
 61       
 62     while(L2){     //L2还有结点 
 63         Attach(L2->coef,L2->expon,&Rear);
 64         L2=L2->next;
 65     }
 66     
 67     Rear->next=NULL;
 68     Temp=Front;
 69     Front=Front->next;
 70     free(Temp);    //释放刚刚创建的头结点 
 71     return Front;
 72 } 
 73 
 74 void Attach(int c,int e,Link *pRear){  //在Attach中要修改Rear指针的值,所以这里要的是Rear指针的地址 
 75     //*pRear指针指向尾项 
 76     Link K;
 77     K=(Link)malloc(sizeof(struct LNode));
 78     K->coef=c;
 79     K->expon=e;        //给结点赋值 
 80     K->next=NULL;
 81     (*pRear)->next=K;   //将新结点插入到结果多项式的后面 
 82     (*pRear)=K;         //修改结果多项式最后一项的指针 
 83 }
 84 
 85 
 86 
 87 void Print(Link L){
 88     
 89     printf("\n");
 90     
 91     while(L){
 92         printf("%d  %d\n",L->coef,L->expon);
 93         L=L->next; 
 94     }
 95 }
 96 int main(){
 97     Link L1,L2;
 98     L1=Read();    
 99     printf("----------\n");
100     L2=Read();
101 
102     
103     L1=Add(L1,L2);
104     Print(L1);
105 }

总结:

  在Add函数中通过创建一个临时的空结点,比较L1和L2的每一项中指数的大小,把较大的一个的指数、系数传递到Attach中

  重新创建结点,把指数、系数分别赋值

  最妙的是,在Attach中传递的是Rear的地址,因为每次要修改结果多项式尾指针,所以必须传递地址才行

还有很多的小细节,在编程的过程中要考虑全面

  在两个多项式相等后,要判断和是否为0;为0就不需要传递,不为0才需要传递

猜你喜欢

转载自www.cnblogs.com/hpthinking/p/12116494.html