数据结构和算法-一元多项式运算算法(加法)
算法名称:一元多项式算法
算法介绍:
加法运算:将具有与相同幂项的系数相加即可得到合并后的多项式。若某个幂项只存在于一个多项式中,则直接合并到结果中
举例
利用代码实现
这里主要使用了链表,通过3个函数来进行操作。分别是Inpu函数,Add运算函数,打印函数。
代码:
/*采用链表的方式*/
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
typedef struct polyn //定义多项式的结构
{
float coef; //系数项
int expn; //指数
struct polyn *next; //指向下一项
}POLYN,*pPOLYN;
void PolynInput(pPOLYN *p) //输入一元多项式
{
int i,min=INT_MIN; //INT_MIN是int型的最小数
pPOLYN p1,p2; //分别表示2个多项式的指针
if(!(*p=(POLYN *)malloc(sizeof(POLYN)))) //为头结点分配内存
{
printf("内存分配失败 \n");
exit(0);
}
(*p)->coef=0; //设置头结点的系数为0
printf("输入该多项式的项数:");
scanf("%d",&((*p)->expn));
(*p)->next=NULL;
for(i=0;i<(*p)->expn;i++) //输入多项式各项
{
if(!(p1=(pPOLYN)malloc(sizeof(POLYN)))) //分配一个多项式的内存
{
printf("内存分配失败: \n");
exit(0);
}
printf("第%d项系数:",i+1);
scanf("%f",&(p1->coef));
do{
printf("第%d项指数:",i+1);
scanf("%d",&(p1->expn));
if(p1->expn<min)
printf("\n前项=指数值不能小于前一项指数值%d!\n重新输入\n",(*p)->next->expn);
}while(p1->expn<min);
min=p1->expn;
p1->next=(*p)->next;
(*p)->next=p1;
}
p1=(*p)->next; //合并多项式中指数值相同的项
while(p1)
{
p2=p1->next; //取下一节点
while(p2 && p2->expn==p1->expn) //若节点有效,节点与q节点的指数相同
{
p1->coef+=p2->coef; //累加系数
p1->next=p2->next; //删除r指向的节点
free(p2);
p2=p1->next;
(*p)->expn--;
}
p1=p1->next;
}
}
void PolynPrint(pPOLYN p) //输出多项式
{
pPOLYN p1;
int i;
printf("\n\n计算后的多项式共有%d项 \n",p->expn);
p1=p->next;
i=1;
while(p1)
{
printf("第%d项,系数:%g,指数:%d\n",i++,p1->coef,p1->expn);
p1=p1->next;
}
printf("\n");
}
void PolynAdd(pPOLYN pa,pPOLYN pb) //多项式相加pa=pa+pb
{
pPOLYN pa1,pb1,pc1,p;
pa1=pa->next; //指向被加链表的第一个有效项
pb1=pb->next; //指向加链表的第一个有效项
pc1=pa; //指向被加链表
pc1->next=NULL;
pa->expn=0; //清空多项式项目数据
while(pa1 && pb1) //两个多项式都未结束
{
if(pa1->expn > pb1->expn) //如果pa1指数大于pb1
{
pc1->next=pa1; //将pa1指数加入结果链表中
pc1=pa1;
pa1=pa1->next; //处理pa1中的下一项
pc1->next=NULL;
}else if(pa1->expn < pb1->expn) //pa1的指数小于pb1的指数
{
pc1->next=pb1; //将pb1指数加入结果链表中
pc1=pb1;
pb1=pb1->next; //处理pb1的下一项
pc1->next=NULL;
}else { //pa1指数等于pb1指数,进行系统相加
pa1->coef+=pb1->coef; //累加素数
if(pa1->coef!=0) //若系数不为0
{
pc1->next=pa1; //将相加结果添加到结果链表中
pc1=pa1;
pa1=pa1->next; //处理pa1的下一项
pc1->next=NULL;
p=pb1;
pb1=pb1->next; //处理pb1的下一项
free(p);
}
else{ //系数为0,则不记录该项
p=pa1; //用p指向pa1中的该项
pa1=pa1->next; //链表中删除该项
free(p); //释放该项所占用内存
p=pb1; //用临时指针指向pb1中的该项
pb1=pa1->next; //链表中删除该项
free(p); //释放该项所占用内存
pa->expn--; //后面要进行累加操作,此处先减
}
}
pa-pa->expn++; //累加一个结果项
}
if(pa1) //若pa1中还有项
{
pc1->next=pa1; //将pa1中的项添加到结果链表中
while(pa1)
{
pa->expn++;
pa1=pa1->next;
}
}
if(pb1) //若pb1中还有项
{
pc1->next=pb1; //将pb1中的项添加到结果链表中
while(pb1)
{
pa->expn++;
pb1=pb1->next;
}
}
free(pb); //释放pb头链所占的内存空间
}
int main()
{
pPOLYN pa=NULL,pb=NULL; //指向多项式链表的指针
printf("输入第一个多项式数据:\n");
PolynInput(&pa); //调用函数输入一个多项式
printf("\n输入第二个多项式数据:\n");
PolynInput(&pb); //调用函数,输入另一个多项式
PolynAdd(pa,pb); //调用多项式相加函数
printf("\n两个多项式之和为:");
PolynPrint(pa); //输出运算得到的多项式
getch();
return 0;
}
附件列表