一元多项式的相加减.docx
《一元多项式的相加减.docx》由会员分享,可在线阅读,更多相关《一元多项式的相加减.docx(13页珍藏版)》请在冰豆网上搜索。
一元多项式的相加减
实验一一元多项式的表示和相减、相乘
一、实验目的
1.掌握链表的存储方式
2.掌握一元多项式的存储及运算。
二、实验内容
已知一元多项式P(x)和Q(x)已存在,求P(x)-Q(x)和P(x)*Q(x)并输出。
要求:
1.通过键盘随机输入两多项式P(x)和Q(x)的内容。
2.输出结果要有P(x)和Q(x)的以及它们的差P(x)-Q(x)和乘积P(x)*Q(x)。
三、实验步骤:
1.创建一元多项P(x)和Q(x)。
2.求P(x)-Q(x),P(x)*Q(x)。
3.输出P(x)、Q(x)、P(x)-Q(x),P(x)*Q(x)。
四、算法说明
首先,定义一元多项式的存储方式,然后从键盘输入P(x)和Q(x)对应多项式的各对系数和指数,建立相应的一元多项式
5、测试结果参考下图
多项式相减
多项式相乘
六、源代码
1.多项式的相减
#include
#include
typedefstruct{
floatcoef;//系数
intexpn;//指数
}ElemType;
typedefstructLNode{//结点类型
ElemTypedata;
structLNode*next;
}*LinkList;
voidMakeNode(LinkList&s,ElemTypee){
//生成结点
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
}
voidInsAfter(LinkListp,LinkLists){
//插入结点
s->next=p->next;
p->next=s;
}
intcompare(ElemTypee1,ElemTypee2){
//比较
if(e1.expn>e2.expn)
return1;
elseif(e1.expnreturn-1;
return0;
}
voidOrderInsert(LinkList&L,ElemTypee,int(*compare)(ElemType,ElemType)){
//有序插入
LinkListp=L,q=p->next,s;
while(q){
intn=compare(e,q->data);
if(n<0){
MakeNode(s,e);
InsAfter(p,s);break;
}
elseif(n==0)
{
q->data.coef=q->data.coef+e.coef;
if(q->data.coef==0){p->next=q->next;free(q);}
break;
}
p=p->next;q=p->next;
}
if(q==NULL)
{
MakeNode(s,e);
InsAfter(p,s);//最大,放在最后一个位置
}
}
voidInitList(LinkList&L){
//初始化
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
voidSetCurElem(LinkList&p,ElemTypee){//设置结点
p->data.coef=e.coef;
p->data.expn=e.expn;
}
voidCreatePolyn(LinkList&L,intm){
InitList(L);
ElemTypee;
e.coef=0.0;
e.expn=-1;
SetCurElem(L,e);//设置头结点的数据元素
printf("请输入%d对多项式的值:
\n",m);
for(inti=1;i<=m;i++){
scanf("%f%d",&e.coef,&e.expn);//输入值
OrderInsert(L,e,compare);
}
}
voidshow(LinkListL){
//输出方法
LinkListp=L->next;
if(p){//第一个输出
printf("%.2fX^%d",p->data.coef,p->data.expn);
p=p->next;
}
while(p){
if(p->data.coef>0)
printf("+");
printf("%.2fX^%d",p->data.coef,p->data.expn);
p=p->next;
}
printf("\n");
}
voidListDestroy(LinkList&L){
//销毁
LinkListp=L,q;
while(p){
q=p;
p=p->next;
free(q);
}
}
voidsubtract(LinkListL1,LinkListL2,LinkList&L3){
//多项式相减
ElemTypee;
InitList(L3);
e.coef=0.0;
e.expn=-1;
SetCurElem(L3,e);//设置头结点的数据元素
LinkListp1=L1->next,p2=L2->next,q;//r1始终指向新建链表的尾部,p1和p2表示当前结点
while(p2)
{
p2->data.coef=-p2->data.coef;
p2=p2->next;
}
p2=L2->next;
while(p1&&p2){
intn=compare(p1->data,p2->data);
switch(n){
case-1:
{OrderInsert(L3,p1->data,compare);p1=p1->next;break;}//L1中的值小,插入之
case1:
{OrderInsert(L3,p2->data,compare);p2=p2->next;break;}//L2中的值小,插入之
case0:
{//相同
e.coef=p1->data.coef+p2->data.coef;
e.expn=p1->data.expn;
if(e.coef!
=0){OrderInsert(L3,e,compare);}
p1=p1->next;p2=p2->next;
break;
}
}
}
if(p1)
{OrderInsert(L3,p1->data,compare);p1=p1->next;}//添加L1
elseif(p2)
{OrderInsert(L3,p2->data,compare);p2=p2->next;}//添加L2
}
LinkListFindThan(LinkListX,LinkListL)
{
LinkListTmp;
Tmp=L;
while(Tmp->next!
=NULL&&Tmp->next->data.expn>=X->data.expn){
Tmp=Tmp->next;
}
returnTmp;
}
intmain(){
LinkListL1,L2,L3,L4;
intm,n;
printf("请输入多项式P(X)的项数:
");
scanf("%d",&m);
CreatePolyn(L1,m);
printf("多项式P(X)为:
\n");
show(L1);
printf("请输入多项式Q(X)的项数:
");
scanf("%d",&n);
CreatePolyn(L2,n);
printf("多项式Q(X)为:
\n");
show(L2);
subtract(L1,L2,L3);
printf("多项式P(X)-Q(X)为:
\n");
show(L3);
return0;
}
2.多项式的相乘
#include
#include
typedefstruct{
floatcoef;//系数
intexpn;//指数
}ElemType;
typedefstructLNode{//结点类型
ElemTypedata;
structLNode*next;
}*LinkList;
voidMakeNode(LinkList&s,ElemTypee){
//生成结点
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
}
voidInsAfter(LinkListp,LinkLists){
//插入结点
s->next=p->next;
p->next=s;
}
intcompare(ElemTypee1,ElemTypee2){
//比较
if(e1.expn>e2.expn)
return1;
elseif(e1.expnreturn-1;
return0;
}
voidOrderInsert(LinkList&L,ElemTypee,int(*compare)(ElemType,ElemType)){
//有序插入
LinkListp=L,q=p->next,s;
while(q){
intn=compare(e,q->data);
if(n<0){
MakeNode(s,e);
InsAfter(p,s);break;
}
elseif(n==0)
{
q->data.coef=q->data.coef+e.coef;
if(q->data.coef==0){p->next=q->next;free(q);}
break;
}
p=p->next;q=p->next;
}
if(q==NULL)
{
MakeNode(s,e);
InsAfter(p,s);//最大,放在最后一个位置
}
}
voidInitList(LinkList&L){
//初始化
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
voidSetCurElem(LinkList&p,ElemTypee){//设置结点
p->data.coef=e.coef;
p->data.expn=e.expn;
}
voidCreatePolyn(LinkList&L,intm){
InitList(L);
ElemTypee;
e.coef=0.0;
e.expn=-1;
SetCurElem(L,e);//设置头结点的数据元素
printf("请输入%d对多项式的值:
\n",m);
for(inti=1;i<=m;i++){
scanf("%f%d",&e.coef,&e.expn);//输入值
OrderInsert(L,e,compare);
}
}
voidshow(LinkListL){
//输出方法
LinkListp=L->next;
if(p){//第一个输出
printf("%.2fX^%d",p->data.coef,p->data.expn);
p=p->next;
}
while(p){
if(p->data.coef>0)
printf("+");
printf("%.2fX^%d",p->data.coef,p->data.expn);
p=p->next;
}
printf("\n");
}
voidListDestroy(LinkList&L){
//销毁
LinkListp=L,q;
while(p){
q=p;
p=p->next;
free(q);
}
}
voidMultiply(LinkListL1,LinkListL2,LinkList&L3){
//多项式相乘
ElemTypee;
InitList(L3);
e.coef=0.0;
e.expn=-1;
SetCurElem(L3,e);//设置头结点的数据元素
LinkListp1=L1->next,p2=L2->next,q;//r1始终指向新建链表的尾部,p1和p2表示当前结点
while(p1){
p2=L2->next;
while(p2){
e.coef=p1->data.coef*p2->data.coef;
e.expn=p1->data.expn+p2->data.expn;
OrderInsert(L3,e,compare);
p2=p2->next;
}
p1=p1->next;
}}
intmain(){
LinkListL1,L2,L3;
intm,n;
printf("请输入多项式P(X)的项数:
");
scanf("%d",&m);
CreatePolyn(L1,m);
printf("多项式P(X)为:
\n");
show(L1);
printf("请输入多项式Q(X)的项数:
");
scanf("%d",&n);
CreatePolyn(L2,n);
printf("多项式Q(X)为:
\n");
show(L2);
Multiply(L1,L2,L3);
printf("多项式P(X)*Q(X)为:
\n");
show(L3);
return0;
}
7、分析总结
本程序从源代码开始经过多次调试,一开始创建多项式并没有遇到什么问题,但是减法开始遇到问题,好在经过调试和反复检验后问题都得以解决,在多项式相加的基础上修改,相减和相乘就容易得多。
相减主要是整体把另一个多项式前加一个负号,总的运算还是和相加一样。
而相乘,需要两个循环,一个多项式中的一个单项式与第二个多项式中的各个单项式相乘,再回上去第一个多项式的第二个单项式与第二个多项式中的各个单项式相乘,如此循环。
全部相乘完毕之后,形成第三个多项式,还要比较各系数进行合并,这个操作在之前多项式相加中用到过,可以调用函数。
相减与相乘的一个共同点是都要比较各系数进行合并,用case循环。
这与课堂听讲,自学与练习相辅相成,锻炼了个人学习的能力。