这个我也是借鉴网上的,加了一些自己的理解,改了一些小东西,感觉还是菜逼,还有这个程序还是有bug,感觉原作者的bug更多,算啦,原作者写的挺好的,这要是不用这鬼指针写多好,指针真的烦
以下的加了一些我理解代码的注释,希望能帮助理解
输入的第一个多项式为:2x^3-4x^5
输入的第二个多项式为:4x^4+4x^5
#include <stdio.h>
#include <stdlib.h>
typedef struct polynomial
{
float coef;//系数
int expn;//指数
struct polynomial *next;
} polynomial;
void CreatePolyn(polynomial **p, int m) //p为一个二级指针,
{
int i, data;
int flag;
polynomial *cp, *temp;
(*p) = (polynomial *)malloc(sizeof(polynomial));
(*p)->coef = 0.0;
(*p)->expn = -1;
(*p)->next = NULL;
for(i=1; i<=m; ++i)
{
cp = *p;//初始位置
flag = 0; //标志多项式中是否已经存在相同指数的多项式
temp = (polynomial *)malloc(sizeof(polynomial));
printf("请输入第%d项的系数:", i);
scanf("%f", &(temp->coef));
printf("请输入第%d项的指数:", i);
scanf("%d", &(temp->expn));
while(cp->next && temp->expn > cp->next->expn)
{
cp = cp->next;
}
//相当于弄出一个指数递增的多项式
if(cp->next && temp->expn == cp->next->expn)
{
continue;// 如果已经存在相同指数的多项式,忽略该项
}
temp->next = cp->next;
cp->next = temp;
}
}
// 打印多项式
void PrintPolyn(polynomial *p)
{
polynomial *temp = p->next;
int a[100000];
double b[100000];
int aid=0,bid=0;
int cnt=0;
printf("升幂情况:");
while(temp)
{
if(cnt!=0&&temp->coef>0)printf("+");
b[bid]=temp->coef;
a[aid]= temp->expn;
printf("%.2fx^%d ", b[bid], a[aid]);
aid++;
bid++;
cnt++;
temp = temp->next;
}
if(cnt==0)printf("0");//如果是空的输出0
printf("\n");
printf("降幂情况:");
int ans=0;
for(int i=aid-1; i>=0; i--)
{
if(ans!=0&&b[i]>0)printf("+");
printf("%.2fx^%d ", b[i], a[i]);
ans++;
}
}
// 多项式加法
void AddPolyn(polynomial **pa, polynomial **pb)
{
polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
//用*p = (*pa),直接在pa上面进行修改
cpa = (*pa)->next;
cpb = (*pb)->next;
//这下面基本就是一个合并的过程,之前链表有练习有个合并的
while(cpa && cpb)
{
if(cpa->expn < cpb->expn)
{
p->next = cpa;
p = cpa;
cpa = cpa->next;
}
else if(cpa->expn > cpb->expn)
{
p->next = cpb;
p = cpb;
cpb = cpb->next;
}
else
{
if(cpa->coef + cpb->coef == 0)
{
cpa = cpa->next;
cpb = cpb->next;
}
else
{
cpa->coef += cpb->coef;
p->next = cpa;
p = cpa;
cpa = cpa->next;
cpb = cpb->next;
}
}
}
if(cpa)
p->next = cpa;
else
p->next = cpb;
free(*pb);
}
// 多项式减法
void SubtractPolyn(polynomial **pa, polynomial **pb)
{
polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
cpa = (*pa)->next;
cpb = (*pb)->next;
while(cpa && cpb)
{
if(cpa->expn < cpb->expn)
{
p->next = cpa;
p = cpa;
cpa = cpa->next;
}
else if(cpa->expn > cpb->expn)
{
p->next = cpb;
p = cpb;
p->coef *= -1; // 改变系数的符号,将减数多项式的系数变为负的
cpb = cpb->next;
}
else // cpa->expn == cpb->expn 指数相等
{
if(cpa->coef == cpb->coef) //如果两项系数相等,删除该节点
{
cpa = cpa->next;
cpb = cpb->next;
}
else
{
cpa->coef -= cpb->coef;
p->next = cpa;
p = cpa;
cpa = cpa->next;
cpb = cpb->next;
}
}
}
// 注意:cpa和cpb不是互斥关系,需分开两个if分支,但最多只有一个分支执行,可能同时不执行
if(cpa)
p->next = cpa;
if(cpb)
{
p->next = cpb;
while(cpb)
{
cpb->coef *= -1; // 改变系数的符号,将减数多项式的系数变为负的
cpb = cpb->next;
}
}
free(*pb);
}
//将pb中的多项式复制到pa中
void CopyPolyn(polynomial **pa, polynomial *pb)
{
CreatePolyn(pa, 0);
polynomial *temp, *cpa;
cpa = *pa;
pb = pb->next; // 移动指针指向第一个节点
while(pb)
{
temp = (polynomial *)malloc(sizeof(polynomial));
temp->coef = pb->coef;
temp->expn = pb->expn;
temp->next = NULL;
cpa->next = temp;
cpa = temp;
pb = pb->next;
}
}
//pa为多项式。pb为单项式,与pa中的每一项相乘,结果保存到pa中
void MultiplyOperate(polynomial *pa, polynomial *pb)
{
pa = pa->next;
while(pa)
{
pa->coef *= pb->coef;
pa->expn += pb->expn;
pa = pa->next;
}
}
// 多项式乘法
void MultiplyPolyn(polynomial **pa, polynomial **pb)
{
// pa应该在此过程中保持不变,直到得到最后的结果
polynomial *cpa, *ccpa, *res;
cpa = *pa; //保存着原pa的内容
CreatePolyn(pa, 0); //从新初始化pa为头结点
(*pb) = (*pb)->next;
while(*pb)
{
CopyPolyn(&ccpa, cpa);//将cpa(内容是pa)复制到ccpa
MultiplyOperate(ccpa, *pb);//将ccpa分别与pb其中一项相乘
AddPolyn(pa, &ccpa);//将结果加入到pa中
(*pb) = (*pb)->next;
}
}
int main()
{
printf("--------欢迎来到一元多项式计算器--------\n");
polynomial *pa, *pb;
int n,m;
printf("++++++++请输入第一个多项式的项数:++++++++\n");
scanf("%d",&n);
CreatePolyn(&pa, n);
printf("++++++++请输入第二个多项式的项数:++++++++\n");
scanf("%d",&m);
CreatePolyn(&pb, m);
printf("请选择两个多项是计算的方式\n");
printf("********************************\n");
int choose;
printf("1:相加 2:相减 3:相乘\n");
printf("********************************\n");
printf("请输入:");
scanf("%d",&choose);
if(choose==1)
AddPolyn(&pa,&pb);
else if(choose==2)
SubtractPolyn(&pa, &pb);
else
MultiplyPolyn(&pa, &pb);
printf("计算结果如下:\n");
PrintPolyn(pa);
printf("\n");
return 0;
}