6-26 PolynAdd.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <limits.h> 4 typedef struct polyn //定义多项式项的结构 5 { 6 float coef; //系数项 7 int expn; //指数 8 struct polyn *next; //指向下一项 9 }POLYN,*pPOLYN; 10 void PolynInput(pPOLYN *p) //输入一元多项式 11 { 12 int i,min=INT_MIN; //INT_MIN为int型的最小数 13 pPOLYN p1,p2; 14 if(!(*p=(POLYN *)malloc(sizeof(POLYN)))) //为头结点分配内存 15 { 16 printf("内存分配失败!\n"); 17 exit(0); 18 } 19 (*p)->coef=0; //设置头结点的系数为0 20 printf("输入该多项式的项数:"); 21 scanf("%d",&((*p)->expn)); //使用头结点的指数域保存项数 22 (*p)->next=NULL; 23 for(i=0;i<(*p)->expn;i++) //输入多项式各项 24 { 25 if(!(p1=(pPOLYN)malloc(sizeof(POLYN)))) //分配保存一个多项式项的内存 26 { 27 printf("内存分配失败!\n"); 28 exit(0); 29 } 30 printf("第%d项系数:",i+1); 31 scanf("%f",&(p1->coef)); 32 do{ 33 printf("第%d项指数:",i+1); 34 scanf("%d",&(p1->expn)); 35 if(p1->expn<min) 36 printf("\n前项指数值不能小于前一项指数值%d!\n重新输入!\n",(*p)->next->expn); 37 }while(p1->expn<min); //使每一项的指数为递增 38 min=p1->expn; //保存本次输入的指数作为参考依据 39 p1->next=(*p)->next;//将节点插入链表中(插入到链表头后面的第1个位置) 40 (*p)->next=p1; 41 } 42 p1=(*p)->next;//合并多项式中指数值相同的项 43 while(p1) 44 { 45 p2=p1->next; //取下一节点 46 while(p2 && p2->expn==p1->expn) //若节点有效,节与q结点的指数相同 47 { 48 p1->coef+=p2->coef; //累加系数 49 p1->next=p2->next; //删除r指向的节点 50 free(p2); //释放p2节点占用的内存 51 p2=p1->next; //处理下一节点 52 (*p)->expn--; //总节点数减1 53 } 54 p1=p1->next; 55 } 56 } 57 void PolynPrint(pPOLYN p) //输出多项式 58 { 59 pPOLYN p1; 60 int i; 61 printf("\n\n计算后的多项式共有%d项。\n",p->expn); 62 p1=p->next; 63 i=1; 64 while(p1) 65 { 66 printf("第%d项,系数:%g,指数:%d\n",i++,p1->coef,p1->expn); 67 p1=p1->next; 68 } 69 printf("\n"); 70 } 71 void PolynAdd(pPOLYN pa,pPOLYN pb) //多项式相加 pa=pa+pb 72 { 73 pPOLYN pa1,pb1,pc1,p; 74 pa1=pa->next; //指向被加链表的第1个有效项 75 pb1=pb->next; //指向加链表 的第1个有效项 76 pc1=pa; //指向被加链表 77 pc1->next=NULL; 78 pa->expn=0; //清空多项式项目数量 79 while(pa1 && pb1) //两个多项式都未结束 80 { 81 if(pa1->expn > pb1->expn) //pa1指数大于pb1指数 82 { 83 pc1->next=pa1; //将pa1加入结果链表中 84 pc1=pa1; 85 pa1=pa1->next; //处理pa1中的下一项 86 pc1->next=NULL; 87 }else if(pa1->expn < pb1->expn){ //pa1指数小于pb1指数 88 pc1->next=pb1; //将pb1加入结果 链表中 89 pc1=pb1; 90 pb1=pb1->next; //处理pb1中的下一项 91 pc1->next=NULL; 92 }else{ //pa1指数等于pb1指数,进行系数相加 93 pa1->coef+=pb1->coef; //累加素数 94 if(pa1->coef!=0) //若系数不为0 95 { 96 pc1->next=pa1; //将相加结果添加到结果链表中 97 pc1=pa1; 98 pa1=pa1->next; //处理pa1中的下一项 99 pc1->next=NULL; 100 p=pb1; 101 pb1=pb1->next; //处理pb1中的下一项 102 free(p); 103 } 104 else//系数为0,则不记录该项 105 { 106 p=pa1; //用临时指针指向pa1中的该项 107 pa1=pa1->next; //从链表中删除该项 108 free(p); //释放该项占用内存 109 p=pb1; //用临时指针指向pb1中的该项 110 pb1=pb1->next;//从链表中删除该项 111 free(p);//释放该项占用内存 112 pa->expn--;//后面要进行累加操作,此处先减1 113 } 114 } 115 pa->expn++; //累加一个结果项 116 } 117 if(pa1) //若pa1中还有项 118 { 119 pc1->next=pa1; //将pa1中的项添加到结果链表中 120 while(pa1) 121 { 122 pa->expn++; 123 pa1=pa1->next; 124 } 125 } 126 if(pb1) //若pb1中还有项 127 { 128 pc1->next=pb1; //将pb1中的项添加到结果链表中 129 while(pb1) 130 { 131 pa->expn++; 132 pb1=pb1->next; 133 } 134 } 135 free(pb); //释放pb头链所占的空间 136 } 137 int main() 138 { 139 pPOLYN pa=NULL,pb=NULL; //指向多项式链表的指针 140 printf("输入第一个多项式数据:\n"); 141 PolynInput(&pa); //调用函数输入一个多项式 142 printf("\n输入第二个多项式数据:\n"); 143 PolynInput(&pb); //调用函数,输入另一个多项式 144 PolynAdd(pa,pb); //调用多项式相加函数 145 printf("\n两个多项式之和为:"); 146 PolynPrint(pa); //输出运算得到的多项式 147 getch(); 148 return 0; 149 }