3.线性表的应用-一元多项式的计算
来源:互联网 发布:网络主播文儿的歌曲 编辑:程序博客网 时间:2024/03/29 05:17
1.理论
一元多项式可以很容易的表示为线性表如:2*X^8-9*X^5+5*X^2+8,构成的线性表为{{2,8}, {-9,5}, {5,2}, {8,0}},线性表的每个数据元素为{系数,上标}的形式。考虑到多项式的次数可能很高且变化很大,我们采用双向链表的形式来作为多项式的逻辑结构。
我们假设输入的多项式按照次数的高低从前往后排列,不满足这一条件的使用排序来达到这样的效果。这样进行多项式的加、减操作时,只需要分配一个新的链表,从前往后遍历两个相加、减的多项式,比较多项式项次数的高低来插入较高次数的多项式到新链表,次数相等的多项式项加、减对应的基数后再插入。多项式的乘法就是展开各个项相乘后再累加起来,原理是一样的。
下面是部分实现程序,其中注意完整程序加减法都提供了一个Slow版本和一个Fast版本:Slow版本就是新分配一个链表,遍历多项式的两个链表项复制它们的值来插入,需要动态开辟内存,相对较慢;Fast版本利用了指针的特性,直接将各个项串接起来,相对较快,但是这样导致原来相加、减的两个多项式项的链表发生了变化,这是我们不希望看到的,如果非要这个函数,必须先复制两个多项式做备份,这里放上这个Fast函数只是为了补充说明链表合并的方便性。
2.实现程序
链表存储结构
typedef struct{int base;//多项式系数,头节点用它保存长度int superscript;//多项式次数(上标)} JWListElem;typedef struct tagJWListNode{JWListElemelem;//数据元素struct tagJWListNode*pNext;//下一个节点指针struct tagJWListNode*pPrior;//上一个节点指针}JWListNode, *PJWListNode, JWList, *PJWList;
typedef PJWList Poly ;
多项式操作函数
/*功能:将两个从高次到低次排序好的多项式相加输入:多项式p1和p2输出:相加后的多项式说明:由于结果的生成要不断的重新申请空间运行速度相对较慢,但是p1和p2保持不变*/Poly PolyAddSlow(Poly p1, Poly p2){PolypAdd,pTemp1,pTemp2;JWListElemAddTemp;//相加过程中的临时变量pAdd= JWListCreateFromHead(0, NULL);//相加的结果pAddpTemp1= p1->pNext;//多项式p1的移动指针pTemp1pTemp2= p2->pNext;//多项式p2的移动指针pTemp2//两者交替比较,上标大的先插入,相同上标时基数累加while(pTemp1 != NULL && pTemp2 != NULL){if(pTemp1->elem.superscript > pTemp2->elem.superscript){JWListInsert(pAdd, JWListGetLength(pAdd), pTemp1->elem);pTemp1 = pTemp1->pNext;}else if(pTemp1->elem.superscript < pTemp2->elem.superscript){JWListInsert(pAdd, JWListGetLength(pAdd), pTemp2->elem);pTemp2 = pTemp2->pNext;}else{AddTemp.base = pTemp1->elem.base + pTemp2->elem.base;if(0 != AddTemp.base)//剔除相加后基数变为0的情况{AddTemp.superscript = pTemp1->elem.superscript;JWListInsert(pAdd, JWListGetLength(pAdd), AddTemp);}pTemp1 = pTemp1->pNext;pTemp2 = pTemp2->pNext;}}//将剩余的全部插在链表结尾while(pTemp1 != NULL){JWListInsert(pAdd, JWListGetLength(pAdd), pTemp1->elem);pTemp1 = pTemp1->pNext;}while(pTemp2 != NULL){JWListInsert(pAdd, JWListGetLength(pAdd), pTemp2->elem);pTemp2 = pTemp2->pNext;}return pAdd;}/*功能:将两个从高次到低次排序好的多项式相减输入:多项式p1和p2,p1-p2输出:相减后的多项式说明:由于结果的生成要不断的重新申请空间运行速度相对较慢,但是p1和p2保持不变*/Poly PolySubtractSlow(Poly p1, Poly p2){PolypSub,pTemp1,pTemp2;JWListElemSubTemp;//相减过程中的临时变量pSub= JWListCreateFromHead(0, NULL);//相减的结果pSubpTemp1= p1->pNext;//多项式p1的移动指针pTemp1pTemp2= p2->pNext;//多项式p2的移动指针pTemp2//两者交替比较,上标大的先插入,相同上标时基数相减while(pTemp1 != NULL && pTemp2 != NULL){if(pTemp1->elem.superscript > pTemp2->elem.superscript){JWListInsert(pSub, JWListGetLength(pSub), pTemp1->elem);pTemp1 = pTemp1->pNext;}else if(pTemp1->elem.superscript < pTemp2->elem.superscript){SubTemp.base = 0 - pTemp2->elem.base;SubTemp.superscript = pTemp2->elem.superscript;JWListInsert(pSub, JWListGetLength(pSub), SubTemp);pTemp2 = pTemp2->pNext;}else{SubTemp.base = pTemp1->elem.base - pTemp2->elem.base;if(0 != SubTemp.base)//剔除相减后基数变为0的情况{SubTemp.superscript = pTemp1->elem.superscript;JWListInsert(pSub, JWListGetLength(pSub), SubTemp);}pTemp1 = pTemp1->pNext;pTemp2 = pTemp2->pNext;}}//将剩余的全部插在链表结尾while(pTemp1 != NULL){JWListInsert(pSub, JWListGetLength(pSub), pTemp1->elem);pTemp1 = pTemp1->pNext;}while(pTemp2 != NULL){SubTemp.base = 0 - pTemp2->elem.base;SubTemp.superscript = pTemp2->elem.superscript;JWListInsert(pSub, JWListGetLength(pSub), SubTemp);pTemp2 = pTemp2->pNext;}return pSub;}/*功能:将两个从高次到低次排序好的多项式相乘输入:两个多项式p1和p2输出:相乘后的多项式*/Poly PolyMultiply(Poly p1, Poly p2){PolypMulti, pMultiTemp, pTemp1, pTemp2, pLine;JWListElemeTemp;pMultiTemp= pMulti = JWListCreateFromHead(0, NULL);pTemp1= p1->pNext;//循环展开多项式while(pTemp1 != NULL){pLine = JWListCreateFromHead(0, NULL);//创建新的一次展开计算pTemp2 = p2->pNext;//重置pTemp2循环初始值while(pTemp2 != NULL){eTemp.base = pTemp1->elem.base * pTemp2->elem.base;eTemp.superscript = pTemp1->elem.superscript * pTemp2->elem.superscript;JWListInsert(pLine, JWListGetLength(pLine), eTemp);//展开项构成新的多项式pTemp2 = pTemp2->pNext;}//将已有结果累加PolySort(pLine);//调整pTemp1的负上标和pTemp2相乘后上标排列顺序还是从高到低!!!pMulti = PolyAddSlow(pMultiTemp, pLine);//删除上一次展开计算的结果JWListDestroy(pMultiTemp);JWListDestroy(pLine);pMultiTemp = pMulti;pTemp1 = pTemp1->pNext;}return pMulti;}
3.运行结果
这里放上示例计算结果供对比
完整程序下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219 0 0
- 3.线性表的应用-一元多项式的计算
- 线性表的应用---一元多项式的表示与相加
- 一元多项式的计算
- 一元多项式的计算
- 线性表的应用——多项式的计算
- 线性表的应用——一元多项式的代数运算
- 线性表实现一元多项式的表示及相加
- 数据结构之链表一元多项式的计算
- 计算两个一元多项式的乘积
- 一元多项式的表示及相加 【链表的应用】
- 线性表应用举例——一元多项式相加问题
- 线性表(一元多项式)
- 线性表---一元多项式相加
- [线性表]一元多项式相乘
- 线性表的应用----多项式操作
- 多项式运算线性链表的应用
- 一元多项式相乘 - 链表的简单应用
- 线性结构2 一元多项式的乘法与加法运算
- 关于js的全局对象
- STM32 定时器浅谈_1
- Java设计模式研究之策略模式
- UVA11987- Almost Union-Find
- struts2+jqury ajax问题汇总与解决办法
- 3.线性表的应用-一元多项式的计算
- C#中如何获取字体类型,颜色,和大小.
- 异常:System.IO.FileNotFoundException: 未能加载文件或程序集“Microsoft.mshtml
- ios申请真机调试( xcode 5)详细解析
- 2014 第十一届浙江省程序设计竞赛
- Cocos2x 适配
- 多线程__下
- java枚举一个目录下的所有文件的问题
- POJ1006