采用链表的结构存储一元多项式
那么到底存储什么呢???
存指数、系数
通过给链表设置三个数据域,一个指数域、一个系数域、一个指针域,这就可以表示一元多项式的一项了
然后让链表按照指数递减的顺序存储
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才需要传递