【数据结构与算法】一元多项式的乘法

实验名称

一元多项式的乘法

实验内容

编写可运行程序来实现一元多项式的乘法:

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. 输入多组数据来测试代码:

实验总结

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;
}
  • 31
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值