程序运行结果

单链表实现一元多项式加法与乘法 - 图1

实现原理

多项式加法:

(1)如果cpa的指数<cpb的指数,则将cpa所指向的插入和多项式链中,向后移动指针;

(2)如果cpa的指数>cpb的指数,则将cpb所指向的插入和多项式链中,向后移动指针;

(3)如果cpa的指数=cpb的指数,则若cpa的指数+cpb的指数=0,则删除相应结点,向后移动指针,并释放内存空间;

(4)否则cpa的指数+cpb的指数!=0,则修改同指数项的系数值,向后移动指针;

(5)如果pa链表非空,则链接pa剩余结点;

(6)如果pb链表非空,则链接pb剩余结点。

多项式乘法:

(1)多项式乘法可以看成单项式和多项式相乘,再作加法;

(2)可以利用循环,将被乘多项式与乘多项式每一项依次相乘;

(3)循环中每一次应累加部分积;

(4)循环结束时多项式相乘完成。

程序实现

  1. 创建多项式,m为多项式的项数,当m为0时,函数只初始化头结点
  1. void CreatePolyn(polynomial **p, int m){
  2. int i, data;
  3. int flag;
  4. polynomial *cp, *temp;
  5. (*p) = (polynomial *)malloc(sizeof(polynomial));
  6. (*p)->coef = 0.0;
  7. (*p)->expn = -1;
  8. (*p)->next = NULL;
  9. for(i = 1; i <= m; ++i){
  10. cp = *p;
  11. flag = 0; // 标志多项式中是否已经存在相同指数的多项式
  12. temp = (polynomial *)malloc(sizeof(polynomial));
  13. // 接收所输入的多项式的各项,默认各项指数互异
  14. scanf("%f %d", &(temp->coef), &(temp->expn));
  15. while(cp->next && temp->expn > cp->next->expn){
  16. cp = cp->next;
  17. }
  18. if(cp->next && temp->expn == cp->next->expn){
  19. continue;// 如果已经存在相同指数的多项式,忽略该项
  20. }
  21. temp->next = cp->next;
  22. cp->next = temp;
  23. }
  24. }
  1. 打印多项式,考虑多种特殊项的格式,均以最简形式打印
  1. void PrintPolyn(polynomial *p){
  2. polynomial *temp = p->next;
  3. while(temp){
  4. if(temp->coef == 1 && temp->expn == 0) // 1x^0 = 1
  5. printf("1");
  6. else if(temp->coef == 1 && temp->expn == 1) // 1x^1 = x
  7. printf("x", temp->coef);
  8. else{
  9. if(temp->expn == 0) // nx^0 = n
  10. printf("%.0f", temp->coef);
  11. else if(temp->expn == 1) // nx^1 = nx
  12. printf("%.0fx", temp->coef);
  13. else{
  14. if(temp->coef == 1){
  15. if(temp->expn < 0) // 1x^(-m) = x^(-m)
  16. printf("x^(%d)", temp->expn);
  17. else // 1x^m = x^m
  18. printf("x^%d", temp->expn);
  19. }
  20. else{ // nx^(-m) = nx^(-m)
  21. if(temp->expn < 0)
  22. printf("%.0fx^(%d)", temp->coef, temp->expn);
  23. else // nx^m = nx^m
  24. printf("%.0fx^%d", temp->coef, temp->expn);
  25. }
  26. }
  27. }
  28. temp = temp->next;
  29. if(temp)
  30. printf(" + ");
  31. }
  32. }
  1. 将pb中的多项式复制到pa中
  1. void CopyPolyn(polynomial **pa, polynomial *pb){
  2. CreatePolyn(pa, 0);
  3. polynomial *temp, *cpa;
  4. cpa = *pa;
  5. pb = pb->next; // 移动指针指向第一个节点
  6. while(pb){
  7. temp = (polynomial *)malloc(sizeof(polynomial));
  8. temp->coef = pb->coef;
  9. temp->expn = pb->expn;
  10. temp->next = NULL;
  11. cpa->next = temp;
  12. cpa = temp;
  13. pb = pb->next;
  14. }
  15. }
  1. 多项式加法,结果保存在pa中
  1. void AddPolyn(polynomial **pa, polynomial **pb){
  2. polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
  3. cpa = (*pa)->next;
  4. cpb = (*pb)->next;
  5. while(cpa && cpb){
  6. if(cpa->expn < cpb->expn){ // cpa的指数<cpb的指数,则将cpa所指向的插入和多项式链中,向后移动指针
  7. p->next = cpa;
  8. p = cpa;
  9. cpa = cpa->next;
  10. } else if(cpa->expn > cpb->expn) { // cpa的指数>cpb的指数,则将cpb所指向的插入和多项式链中,向后移动指针
  11. p->next = cpb;
  12. p = cpb;
  13. cpb = cpb->next;
  14. } else { // cpa的指数=cpb的指数
  15. if(cpa->coef + cpb->coef == 0){ // cpa的指数+cpb的指数=0,则删除相应结点,向后移动指针,并释放内存空间
  16. temp = *pa;
  17. while(temp->next != cpa)
  18. temp = temp->next;
  19. temp->next = cpa->next;
  20. ccpa = cpa;
  21. cpa = cpa->next;
  22. cpb = cpb->next;
  23. free(ccpa);
  24. } else { // cpa的指数+cpb的指数!=0,则修改同指数项的系数值,向后移动指针
  25. cpa->coef += cpb->coef;
  26. p->next = cpa;
  27. p = cpa;
  28. cpa = cpa->next;
  29. cpb = cpb->next;
  30. }
  31. }
  32. }
  33. if(cpa)
  34. p->next = cpa; // pa链表非空,链接pa剩余结点
  35. else
  36. p->next = cpb; // pb链表非空,链接pb剩余结点
  37. free(*pb);
  38. }
  1. pa为多项式,pb为单项式,依次与pa中的每一项相乘,将结果保存到pa中
  1. void MultiplyOperate(polynomial *pa, polynomial *pb){
  2. pa = pa->next;
  3. while(pa){
  4. pa->coef *= pb->coef;
  5. pa->expn += pb->expn;
  6. pa = pa->next;
  7. }
  8. }
  1. 多项式乘法,结果保存在pa中
  1. void MultiplyPolyn(polynomial **pa, polynomial **pb){
  2. polynomial *cpa, *ccpa, *res;
  3. cpa = *pa; // 保存着原pa的内容
  4. CreatePolyn(pa, 0); // 从新初始化pa为头结点
  5. (*pb) = (*pb)->next; // 依次从pb中提取单项式
  6. while(*pb){
  7. CopyPolyn(&ccpa, cpa);
  8. MultiplyOperate(ccpa, *pb); // 将所提取的单项式,依次与pa中的每一项相乘
  9. AddPolyn(pa, &ccpa); // 将部分积累加
  10. (*pb) = (*pb)->next; // 提取下一个单项式
  11. }
  12. }
  1. 主函数
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /* 单链表实现多项式相加和相乘 */
  4. typedef struct polynomial{
  5. float coef; // 项的系数
  6. int expn; // 项的指数
  7. struct polynomial *next;
  8. }polynomial;
  9. int main(){
  10. polynomial *pa, *pb, *cpa, *cpb;
  11. int ma, mb;
  12. printf("请输入多项式A的项数:");
  13. scanf("%d", &ma);
  14. printf("请输入多项式A的各项系数和指数:");
  15. CreatePolyn(&pa, ma);
  16. CopyPolyn(&cpa, pa);
  17. printf("A = ");
  18. PrintPolyn(pa);
  19. printf("\n请输入多项式B的项数:");
  20. scanf("%d", &mb);
  21. printf("请输入多项式B的各项系数和指数:");
  22. CreatePolyn(&pb, mb);
  23. CopyPolyn(&cpb, pb);
  24. printf("B = ");
  25. PrintPolyn(pb);
  26. AddPolyn(&cpa, &cpb);
  27. MultiplyPolyn(&pa, &pb);
  28. printf("\n\nA + B = ");
  29. PrintPolyn(cpa);
  30. printf("\nA * B = ");
  31. PrintPolyn(pa);
  32. return 0;
  33. }