📄 dx.cpp
字号:
#include <iostream.h>
#include <math.h>
typedef struct node // 定义单链表结点的数据类型mulpoly
{
double coef; // 表示系数
int exp; // 表示指数
struct node * next; // 指向下一项结点的指针
}mulpoly;
mulpoly * create() // 逐项输入系数和指数,建立单链表的函数
{
mulpoly * h, * p, * q;
h=new mulpoly; // 建立头结点
p=h; // 头结点作为初始的前驱
double x;
cout<<"输入第1项的系数,输入系数是零截止: ";
cin>>x; // 输入第1项的系数
while(x) // 循环建立各项结点,直到输入系数是零为止
{
q=new mulpoly;
cout<<" 输入一个指数 ";
cin>>q->exp; // 输入指数
q->coef=x; // 保存系数
p->next=q; // 前驱的next指向新建结点
p=q; // 下一个结点的前驱即当前结点
cout<<"继续输入系数 ";
cin>>x; // 继续输入系数
}
p->next=NULL; // 最后一项结点无后继
return h; // 返回头指针
}
void output(mulpoly * h) // 遍历单链表,输出一元多项式的函数
{
mulpoly * p;
cout<<"Y=";
p=h->next;
if(p!=NULL) // 输出多项式的第1项
{
cout<<p->coef;
if(p->exp!=0)
cout<<"X";
if(p->exp>1)
cout<<"^"<<p->exp;
p=p->next;
}
while(p!=NULL) // 逐项输出后续各项
{
if(p->coef>0)
cout<<"+";
cout<<p->coef<<"X";
if(p->exp>1)
cout<<"^"<<p->exp;
p=p->next;
}
cout<<endl;
}
mulpoly * add(mulpoly * a,mulpoly * b) // 两个多项式求和的函数
{
mulpoly * c, * pa, * pb, * pc, * q;
c=new mulpoly; // 建立结果多项式单链表的头结点
pc=c;
pa=a->next;
pb=b->next;
while((pa!=NULL)&&(pb!=NULL))
{
if(pa->exp<pb->exp) // 被加项的指数较小
{
q=new mulpoly;
q->coef=pa->coef;
q->exp=pa->exp;
pa=pa->next;
pc->next=q;
pc=q;
}
else if(pa->exp>pb->exp) // 被加项的指数较大
{
q=new mulpoly;
q->coef=pb->coef;
q->exp=pb->exp;
pb=pb->next;
pc->next=q;
pc=q;
}
else if(fabs(pa->coef+pb->coef)>1e-8) // 指数相同,系数之和非零
{
q=new mulpoly;
q->coef=pa->coef+pb->coef;
q->exp=pa->exp;
pa=pa->next;
pb=pb->next;
pc->next=q;
pc=q;
}
else // 系数之和为零
{
pa=pa->next;
pb=pb->next;
}
}
while(pa!=NULL) // 链接多项式a的剩余项
{
q=new mulpoly;
q->coef=pa->coef;
q->exp=pa->exp;
pa=pa->next;
pc->next=q;
pc=q;
}
while(pb!=NULL) // 链接多项式b的剩余项
{
q=new mulpoly;
q->coef=pb->coef;
q->exp=pb->exp;
pb=pb->next;
pc->next=q;
pc=q;
}
pc->next=NULL;
return c; // 返回头结点
}
mulpoly * subtract(mulpoly * a,mulpoly * b) // 两个多项式求差的函数
{
mulpoly * c, * pa, * pb, * pc, * q;
c=new mulpoly; // 建立结果多项式单链表的头结点
pc=c;
pa=a->next;
pb=b->next;
while((pa!=NULL)&&(pb!=NULL))
{
if(pa->exp<pb->exp) // 被减项的指数较小
{
q=new mulpoly;
q->coef=pa->coef;
q->exp=pa->exp;
pa=pa->next;
pc->next=q;
pc=q;
}
else if(pa->exp>pb->exp) // 被减项的指数较大
{
q=new mulpoly;
q->coef=pb->coef;
q->exp=pb->exp;
pb=pb->next;
pc->next=q;
pc=q;
}
else if(fabs(pa->coef-pb->coef)>1e-8) // 指数相同,系数之差非零
{
q=new mulpoly;
q->coef=pa->coef-pb->coef;
q->exp=pa->exp;
pa=pa->next;
pb=pb->next;
pc->next=q;
pc=q;
}
else // 系数之差为零
{
pa=pa->next;
pb=pb->next;
}
}
while(pa!=NULL) // 链接多项式a的剩余项
{
q=new mulpoly;
q->coef=pa->coef;
q->exp=pa->exp;
pa=pa->next;
pc->next=q;
pc=q;
}
while(pb!=NULL) // 链接多项式b的剩余项
{
q=new mulpoly;
q->coef=-pb->coef;
q->exp=pb->exp;
pb=pb->next;
pc->next=q;
pc=q;
}
pc->next=NULL;
return c; // 返回头结点
}
mulpoly * multiply(mulpoly * a,mulpoly * b) // 两个多项式乘积的函数
{
mulpoly * c, * pa, * pb, * pc, * q, * p;
int j, maxe;
double m_coef;
c=new mulpoly; // 建立结果多项式单链表的头结点
pc=c;
pa=a->next;
while(pa!=NULL) // 双层循环使之各项相乘
{
pb=b->next;
while(pb!=NULL)
{
q=new mulpoly; // 为每次乘积用一个结点存储
q->coef=(pa->coef)*(pb->coef);
q->exp=pa->exp+pb->exp;
maxe=q->exp; // 最高指数
pc->next=q;
pc=q;
pb=pb->next;
}
pa=pa->next;
}
pc->next=NULL;
pa=c;
pc=c->next; // 暂存乘积的第一项地址
for(j=0; j<=maxe; j++) // 合并指数相同的各项
{
p=pc;
m_coef=0.0;
while(p!=NULL)
{
if(p->exp==j) m_coef+=p->coef;
p=p->next;
}
if(fabs(m_coef)>1e-8) // 系数之和非零,建立新的结点存储结果项
{
q=new mulpoly;
q->coef=m_coef;
q->exp=j;
pa->next=q;
pa=q;
}
}
pa->next=NULL;
while(pc!=NULL) // 释放第一次乘积运算的各项结点
{
p=pc;
pc=pc->next;
delete p;
}
return c; // 返回头结点
}
void main() // 主函数
{
mulpoly * ha, * hb, * hc, * hd, * he;
char a;
ha=create();
hb=create();
hc=add(ha,hb);
cout<<"第一个多项式为: ";
output(ha);
cout<<"第二个为: ";
output(hb);
cout<<"输入任意键得出结果: ";
cin>>a;
cout<<"多项式之和: ";
output(hc);
cout<<endl;
hd=subtract(ha,hb);
cout<<"多项式之差: ";
output(hd);
cout<<endl;
he=multiply(ha,hb);
cout<<"多项式的乘积是: ";
output(he);
cout<<endl;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -