实验名称 | 一元多项式的乘法 | ||||
实验内容 | 编写可运行程序来实现一元多项式的乘法: 1.通过键盘随机输入两个多项式A(x)和B(x)的内容。 2.输出结果要有A(x)、B(x)以及他们的乘积C(x)。 3.输入输出多项式的格式可自行定义。 | ||||
实验目的 | 1.理解和掌握线性链表的逻辑机构和物理特性; 2.学会用链表来解决一元多项式相乘的问题; 3.掌握链表和多项式的相关算法。 | ||||
实验步骤 | 1.构造node的结构体,包含系数、指数和next指针。 typedef struct node{ double coef; int expn; struct node* next; }PolyNode ,*pPolyNode; 2.创建一个保存多项式的链表,返回指向头结点的指针,多项式按指数降序排列,便于后续计算 3.实现多项式相乘: 将多项式B的每一项分别与A各项相乘,将所乘形成的新项插人到C多项式中。C多项式一开始为空,并以指数递减的顺序维持当前的运算中间状态。当有新项需要插人时,相当于在一个递减链表中插入一个新结点,并维持递减顺序。如果插入的新结点的指数与链表中某结点的指数一样,则将其系数相加;如果系数相加后的结果为零, | ||||
实验步骤 | 则从中间结果链表中删除相应结点,否则就更改链表中系数值;如果不存在指数相同结点,则将新结点插入到相应位置。 其中多项式最大指数(max Exp)是两个多项式中最大指数相加,相乘后多项式系数是两个多项式系数的乘积。 4.打印函数的书写: void Printpoly(pPolyNode head) { PolyNode *p=head->next; while(p) { printf("%1.1f",p->coef); if(p->expn ) printf("*x^%d",p->expn ); if(p->next && p->next->coef >0) printf("+"); p=p->next; } } 加号的输出是需要注意的一点,当多项式系数大于零的时候输出“+”。
| ||||
实验总结 | 1.一元多项式的乘法和加法是有些相似的,其中一个多项式每一项与另一个多项式相乘后,将得到的多个多项式相加就是最终的结果。 2.通过本次实验的学习,我掌握了多项式相乘的函数的具体实现,链表连接函数的具体实现。认识到链表插入和删除比较快,更加方便进行多项式的相乘和相加等操作。 3.同时数据结构的学习让我感受到了自定义结构的方便与灵活,模块化的函数设计具有很高的灵活性,不用反复书写相同的内容,可以反复调用已经实现的功能,精简了整体结构,使整体代码精简高效。 4.运行编写的代码时,也出现了一些问题,输入的多项式的项数总是比显示的多项式多一项,解决方法是把输入的代码改到while循环里面,并且放在结点向后移动的代码的前面。之前的代码是先输入多项式的一项的系数和指数,之后进入while循环,进行结点的添加、移动,再输入另一组,这样循环。 |
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
double coef;
int expn;
struct node* next;
}PolyNode ,*pPolyNode;
pPolyNode CreatePoly()
{
PolyNode *p,*q,*s,*head=NULL;
double coef;
int expn;
int n;
head=(pPolyNode)malloc( sizeof(PolyNode) );
if(head==NULL)
{
printf("可分配内存失败!\n");
return NULL;
}
head->coef =0.0;
head->expn =0;
head->next =NULL;
printf("请输入多项式的项数:");
scanf("%d",&n);
printf("请输入多项式的系数和指数:\n");
while(n-->0)
{
printf("请输入系数:");
scanf("%lf",&coef);
printf("请输入指数:");
scanf("%d",&expn);
s = (pPolyNode)malloc(sizeof(PolyNode));
s->coef = coef;
s->expn = expn;
q=head->next ;
p=head;
while(q && expn <q->expn )
{
p=q;
q=q->next;
}
if(q== NULL || expn > q->expn )
{
p->next =s;
s->next =q;
}
else
{
q->coef+=coef;
}
}
return head;
}
pPolyNode Reverse(pPolyNode head)
{
PolyNode *p,*q,*t;
p=NULL;
q=head->next;
while( q!=NULL )
{
t=q->next;
q->next =p;
p=q;
q=t;
}
head->next =p;
return head;
}
//多项式相乘
pPolyNode multiply(pPolyNode A,pPolyNode B)
{
PolyNode *pa,*pb,*pc,*u,*head;
int k ,maxExp;
double coef;
head=(pPolyNode)malloc( sizeof (PolyNode) );
if(head==NULL)
{
printf("可分配内存失败!\n");
return NULL;
}
head->coef=0.0;
head->expn =0;
head->next =NULL;
if(A->next !=NULL && B->next != NULL)
{
maxExp=(A->next) ->expn +(B->next )->expn ;
}
else
{
return head;
}
pc=head;
B=Reverse (B);
for(k=maxExp; k>=0; k--)
{
pa = A->next ;
while(pa != NULL && pa->expn >k)
pa=pa->next ;
pb = B->next ;
while( pb != NULL && pa != NULL && (pa->expn + pb->expn) < k )
pb=pb->next;
coef=0.0;
while(pa != NULL && pb != NULL )
{
if( (pa->expn +pb->expn )==k )
{
coef+=pa->coef * pb->coef;
pa=pa->next;
pb=pb->next;
}
else
{
if(( pa->expn + pb->expn ) > k )
{
pa=pa->next;
}
else
{
pb=pb->next;
}
}
}
if( coef != 0.0 )
{
u=(pPolyNode)malloc(sizeof(PolyNode));
u->coef =coef;
u->expn =k;
u->next =pc->next;
pc->next=u;
pc=u;
}
}
B=Reverse(B);
return head;
}
void Printpoly(pPolyNode head)
{
PolyNode *p=head->next;
if(!p)
{
printf("0");
}
while(p)
{
if(p->coef!=0)
{
printf("%1.1f",p->coef);
if(p->expn )
printf("*x^%d",p->expn );
if(p->next && p->next->coef >=0)
printf("+");
}
else
printf("0");
p=p->next;
}
}
int main()
{
pPolyNode A,B,C;
A=CreatePoly();
printf("A(x)=");
Printpoly (A);
printf("\n");
B=CreatePoly();
printf("B(x)=");
Printpoly (B);
printf("\n");
C=multiply(A,B);
printf("C(x)=");
Printpoly (C);
printf("\n");
return 0;
}