1.一元多项式的表示

  可采用线性表的顺序存储结构,但是当多项式的每个项的指数差别很大时,会浪费很多存储空间。所以采用链式存储方式表示,每一项可以表示成一个结点,结点的结构由存放系数的coed域,存放指数的expn域和指向下一个结点的next指针域组成。
  例如,多项式 S(x)=7x6+3x4−3x2+6 S(x)=7x^6+3x^4-3x^2+6可以表示成链表。


2.一元多项式的相乘

  两个一元多项式的相乘运算,需要将一个多项式的每一项的指数与另一个多项式的每一项的质数相加,并将其系数相乘。
  例如两个多项式A(x)和B(x)相乘后得到C(x)。 A(x)=4x4+3x2+5x A(x)=4x^4+3x^2+5x, B(x)=6x3+7x2+8x B(x)=6x^3+7x^2+8x, C(x)=24x7+28x6+50x5+51x4+59x3+40x2 C(x)=24x^7+28x^6+50x^5+51x^4+59x^3+40x^2表示成链式存储结构如下图所示。


  算法思想:设A、B和C分别是多项式A(x)、B(x)和C(x)对应链表的头指针,要计算出A(x)和B(x)的最高指数和,即4+3=7,则A(x)和B(x)的乘机C(x)的指数范围在0~7之间。然后将A(x)的各项按照指数降幂排列,将B(x)按照指数升幂排列,分别设两个指针pa和pb,pa用来指向链表A,pb用来指向链表B,从第一个结点开始计算两个链表的expn域的和,并将其与k比较(k为指数和的范围,从7到0递减),使链表的和呈递减排列。若和小于k,则pb=pb->next;若和等于k,则求出两个多项式系数的乘积,并将其存入新结点中。若和大于k,则pa=pa->next。这样就可以得到多项式 A(x)和B(x)的乘积C(x)。算法结束后重新将链表B逆置,将其恢复原样。

  • 类型定义
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
/*一元多项式结点类型定义*/typedef struct polyn
{float coef;     /*存放一元多项式的系数*/int expn;       /*存放一元多项式的指数*/struct polyn *next;
}PolyNode, *PLinkList;
  • 函数文件
void OutPut(PLinkList 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;}
}PLinkList CreatePolyn()
/*创建一元多项式,使一元多项式呈指数递减*/
{PolyNode *p,*q,*s;PolyNode *head=NULL;int expn2;float coef2;head=(PLinkList)malloc(sizeof(PolyNode));       /*动态生成一个头结点*/if(!head)return NULL;head->coef=0;head->expn=0;head->next=NULL;do{printf("输入系数coef(系数和指数都为0结束)");scanf("%f",&coef2);printf("输入指数exp(系数和指数都为0结束)");scanf("%d",&expn2);if((long)coef2==0&&expn2==0)break;s=(PolyNode*)malloc(sizeof(PolyNode));if(!s)return NULL;s->expn=expn2;s->coef=coef2;q=head->next;                   /*q指向链表的第一个结点,即表尾*/p=head;                     /*p指向q的前驱结点*/while(q&&expn2<q->expn)         /*将新输入的指数与q指向的结点指数比较*/{p=q;q=q->next;}if(q==NULL||expn2>q->expn)      /*q指向要插入结点的位置,p指向要插入结点的前驱*/{p->next=s;                  /*将s结点插入到链表中*/s->next=q;}elseq->coef+=coef2;             /*如果指数与链表中结点指数相同,则将系数相加即可*/} while(1);return head;
}
PolyNode *Reverse(PLinkList head)
/*将生的的链表逆置,使一元多项式呈指数递增形式*/
{PolyNode *q,*r,*p=NULL;q=head->next;while(q){r=q->next;      /*r指向链表的待处理结点*/q->next=p;      /*将链表结点逆置*/p=q;            /*p指向刚逆置后链表结点*/q=r;            /*q指向下一准备逆置的结点*/}head->next=p;       /*将头结点的指针指向已经逆置后的链表*/return head;
}
PolyNode *MultiplyPolyn(PLinkList A,PLinkList B)
/*多项式的乘积。*/
{PolyNode *pa,*pb,*pc,*u,*head;int k,maxExp;float coef;head=(PLinkList)malloc(sizeof(PolyNode));       /*动态生成头结点*/if(!head)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; /*maxExp为两个链表指数的和的最大值*/elsereturn head;pc=head;B=Reverse(B);                           /*使多项式B(x)呈指数递增形式*/for(k=maxExp;k>=0;k--)                  /*多项式的乘积指数范围为0-maxExp*/{pa=A->next;while(pa!=NULL&&pa->expn>k)         /*找到pa的位置*/pa=pa->next;pb=B->next;while(pb!=NULL&&pa!=NULL&&pa->expn+pb->expn<k)/*如果和小于k,使pb移到下一个结点*/pb=pb->next;coef=0.0;while(pa!=NULL&&pb!=NULL){if(pa->expn+pb->expn==k)    /*如果在链表中找到对应的结点,即和等于k,求相应的系数*/{coef+=pa->coef*pb->coef;pa=pa->next;pb=pb->next;}else if(pa->expn+pb->expn>k)    /*如果和大于k,则使pa移到下一个结点*/pa=pa->next;elsepb=pb->next;            /*如果和小于k,则使pb移到到下一个结点*/}if(coef!=0.0)/*如果系数不为0,则生成新结点,并将系数和指数分别赋值给新结点。并将结点插入到链表中*/{u=(PolyNode*)malloc(sizeof(PolyNode));u->coef=coef;u->expn=k;u->next=pc->next;pc->next=u;pc=u;}}B=Reverse(B);           /*完成多项式乘积后,将B(x)呈指数递减形式*/return head;
}
  • 主程序
void main()
{PLinkList A,B,C;A=CreatePolyn();printf("A(x)=");OutPut(A);printf("\n");B=CreatePolyn();printf("B(x)=");OutPut(B);printf("\n");C=MultiplyPolyn(A,B);printf("C(x)=A(x)*B(x)=");OutPut(C);              /*输出结果*/printf("\n");
}
  • 测试结果

【练习】一元多项式的表示与相乘相关推荐

  1. 合集 | 南邮实验报告目录

    南邮实验报告目录 南邮各种学科编程类实验程序 数据结构 南邮数据结构实验1.1:顺序表的相关操作 南邮数据结构实验1.2:带表头结点单链表的相关操作 南邮数据结构实验1.3:带表头结点单链表的逆置 南 ...

  2. 数据结构—— 一元多项式的运算(相加,相减,相乘)【C语言实现】

    用 C语言实现一元多项式的运算(相加,相减,相乘) 1.创建多项式时,无论指数项按什么顺序输入,输出均能实现以升幂顺序输出,且输入时有相同指数项时能够实现合并. 2.能够代入确切的X计算出最终多项式的 ...

  3. 一元多项式的相乘操作(链表)

    一元多项式的乘法运算如何实现,要求多项式采用链表存储结构. 目录 基本思路: 添加条件的分类: multiple()源代码: detach()源代码: 处理结果: 基本思路: 本篇博客不知觉间已经拖了 ...

  4. 一元多项式计算实验报告(相加,相减,相乘)

    一元多项式计算 任务:能够按照指数降序排列建立并输出多项式:能够完成两个多项式的相加.相减和相乘,并将结果输出: 在上交资料中请写明:存储结构.多项式相加的基本过程的算法(可以使用程序流程图).源程序 ...

  5. c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用

    一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...

  6. mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  7. 一元多项式计算器 :加、减、乘运算【完整代码+运行截图+实验说明】

    原文链接 :https://blog.csdn.net/weixin_44119881/article/details/103717231 注意 [ 此套代码,有所缺陷 !!! ] 目   录 1.实 ...

  8. 7-2 一元多项式的乘法与加法运算 (20 分)(思路加详解+map做法)map真香啊 各个测试点的用例子 来吧宝贝!

    一:题目 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以 ...

  9. 线性表实现一元多项式操作

    数组存放: 不需要记录幂,下标就是. 比如1,2,3,5表示1+2x+3x^2+5x^3 有了思路,我们很容易定义结构 typedef struct node{float * coef;//系数数组i ...

最新文章

  1. qhfl-9 微信模板消息推送
  2. 日常方便使用的Python脚本实现
  3. 分析.cpp文件编译生成的汇编文件里语句的作用
  4. C语言 数据结构 树和二叉树
  5. java 链表_java数据结构与算法之顺序表与链表深入分析(一)
  6. 土木专业应用计算机,计算机在土木中的应用
  7. 局域网体系结构与IEEE标准
  8. 2017java考证_Sun认证Java程序员考试试题
  9. java fup spring
  10. Typec接口颜色代表什么?
  11. 自动收取蚂蚁森林能量雨
  12. Same Parity Summands
  13. 零基础-微信小程序入门教程
  14. 2020年保育员(中级)多少分及格及保育员(中级)模拟考试系统
  15. Matplotlib 绘制折线图 - 正余弦函数图像
  16. 5个球放入3个箱子_排列组合问题,把5个相同的球放到三个相同的盒子里,要求每个盒子都有球,则不同的放球方法是多少?...
  17. 网页连接opc服务器,远程连接opc服务器
  18. Python 魔法方法详解
  19. matlab中portcons,马柯维茨均值-方差模型
  20. matlab 指纹,一种基于matlab的指纹识别方法

热门文章

  1. 修改mysql字符集为utf8mb4
  2. GPT转MBR分区格式图文教程
  3. 机器学习----聚类
  4. 本征时间尺度分解(Intrinsic Time-Scale Decomposition)
  5. 无心剑英译席慕容《无怨的青春》
  6. php move函数,php 文件上传 move_uploaded_file
  7. php微信公众号首次关注自动回复,PHP_PHP微信开发之文本自动回复,首先,先去微信公众平台注册 - phpStudy...
  8. 在 JavaScript 中用破折号替换空格
  9. [微信小程序]山庄预订微信小程序——田隐
  10. 华为畅玩5A 移动增强版cam-tl00四步走 一步BL解锁 二步刷recovery 三步root 四步安装框架Xposed