6.7 一元多项式的运算

本文介绍了一种在一元多项式中实现加法运算的方法。通过定义多项式的结构体并利用链表来存储每项系数和指数,实现了多项式的输入、合并同类项及输出功能。此外,还提供了两个多项式相加的算法,并通过实例演示了整个过程。

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 }

 

转载于:https://www.cnblogs.com/wozixiaoyao/p/5683202.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值