两个多项式的加法
2013-06-01 18:05
393 查看
原题:用链式存储结构存放一元多项式Pn(x)=p(1) x e(1) + p(2) x e(2) + ... + p(n) x e(n),其中 p(i)是指数为 e(i) 项的非零系数,且满足 0 <= e(1) < e(2) <...< e(n)=n。请设计算法将多项式B=Pn2(x) 加到多项式 A=Pn1(x),同时对算法及链表的节点结构简单注释。要求利用 Pn1(x) 和Pn2(x)的节点产生最后求得的和多项式,不允许另建和多项式的节点空间。 分析:这本质上是将两个有序链表合并为一个新的有序链表,对于指数相同的项还要进行合并同类项,用
la 和 lb 分别指向多项式 A 和 B ,具体思路如下:
a.设 pa、pb指针分别指向 la 与 lb 的首元素结点, la 的头节点作为新多项式链表的表头结点,释放 lb 指向的节点所占用的空间。
b.进行循环比较执行:每次比较 pa 与 pb 所指项的指数域的值,取下值较小的结点合并到新多项式链表的表尾处;对于指数相同的项,将系数域相加,如果和为 0 ,删除 pa 和 pb 所指项,并使 pa 和pb后移;如果和不为零,则将 pa 所指项的系数域改为原 pa、pb 所指系数域之和,再将 pa 所指项合并到新多项式链表表尾处,删除 pb 所指项,再将 pa、pb 后移到原多项式中的后一项,直到有一个链表为空为止。
c.将 la、lb 中非空指针所指示的链表整体插入在循环链表的表尾。
la 和 lb 分别指向多项式 A 和 B ,具体思路如下:
a.设 pa、pb指针分别指向 la 与 lb 的首元素结点, la 的头节点作为新多项式链表的表头结点,释放 lb 指向的节点所占用的空间。
b.进行循环比较执行:每次比较 pa 与 pb 所指项的指数域的值,取下值较小的结点合并到新多项式链表的表尾处;对于指数相同的项,将系数域相加,如果和为 0 ,删除 pa 和 pb 所指项,并使 pa 和pb后移;如果和不为零,则将 pa 所指项的系数域改为原 pa、pb 所指系数域之和,再将 pa 所指项合并到新多项式链表表尾处,删除 pb 所指项,再将 pa、pb 后移到原多项式中的后一项,直到有一个链表为空为止。
c.将 la、lb 中非空指针所指示的链表整体插入在循环链表的表尾。
#include<iostream.h> #include<stdlib.h> #include<time.h> typedef struct PNode { double coef;//系数 int exp;//指数 struct PNode *next;//指向下一结点的指针 }PNode,*Polynomial; int static flag=0; int CreatePoly(Polynomial &head)//自动生成随机的多项式 { int k,i; head=new PNode; head->next=NULL;head->coef=0;head->exp=0;//头结点系数和指数都为0 Polynomial p,pre,lp; if(flag == 0) { srand((unsigned)time(NULL));flag=1; } k=rand()%12; for(i=0;i<3+k;i++) { p=new PNode;//生成新结点 p->coef=(rand()%100)*3.14; p->exp=rand()%9; if(head->next == NULL)//生成第一个结点时直接链入表头 { head->next=p;p->next=NULL; } else//生成后续结点并按指数从小到大的顺序插入链表 { pre=head;lp=pre->next; while(lp != NULL && lp->exp < p->exp)//寻找插入位置 { pre=lp;lp=lp->next; } //若表中已有指数相同的项,则不插入,直接进行下一次循环 if((lp != NULL && p->exp == lp->exp) || pre->exp == p->exp || p->coef == 0) continue; if(lp != NULL) { p->next=pre->next;pre->next=p; } else { pre->next=p;p->next=NULL; } } } return 1; } int DisplayPoly(Polynomial head)//打印出随机多项式 { Polynomial p=head; while(p->next !=NULL) { cout<<"("<<p->coef<<","<<p->exp<<")"<<" + "; p=p->next; } cout<<"("<<p->coef<<","<<p->exp<<")"<<endl<<endl; return 1; } int AddPolynomial(Polynomial &headla,Polynomial headlb) { Polynomial pa,pb,r,nextpa,nextpb; pa=headla->next;pb=headlb->next; headla->next=NULL;//headla作为新多项式的头结点 r=headla;delete headlb;//r永远指向新多项式链表的表尾 while(pa&&pb) { if(pa->exp < pb->exp) { nextpa=pa->next;//nextpa指向pa所指结点的后继结点 //将pa所指项插入到 r 的表尾处 pa->next=r->next;r->next=pa; r=pa;// r 指向 la 的新表尾 pa=nextpa;// pa 指向 pa 所指项在原多项式链表中的后继 } else if(pa->exp > pb->exp) { nextpb=pb->next;//nextpb指向pb所指结点的后继结点 //将pb所指项插入到 r 的表尾处 pb->next=r->next;r->next=pb; r=pb;// r 指向 la 的新表尾 pb=nextpb;// pb 指向 pb 所指项在原多项式链表中的后继 } else//合并同类项 { double tempcoef;//同类项的系数之和 nextpa=pa->next;nextpb=pb->next; tempcoef=pa->coef + pb->coef; if(tempcoef != 0) {//tempcoef即指数和不为0 pa->coef=tempcoef; pa->next=r->next;r->next=pa; r=pa;// r 指向 headla 的新表尾 pa=nextpa;// pa 指向 pa 所指项在原多项式链表中的后继 delete pb;//删除 pb 所指的项 pb=nextpb;// pb 指向 pb 所指项在原多项式链表中的后继 } else {//tempcoef即指数和为0 delete pa;pa=nextpa; delete pb;pb=nextpb; } } } while(pa) {//将原 headla 链表中剩余的结点插入到新链表中 nextpa=pa->next;pa->next=r->next; r->next=pa;r=pa;pa=nextpa; } while(pb) {//将原 headlb 链表中剩余的结点插入到新链表中 nextpb=pb->next;pb->next=r->next; r->next=pb;r=pb;pb=nextpb; } return 1; } int main() { Polynomial headla,headlb; CreatePoly(headla); CreatePoly(headlb); cout<<"多项式headla的数据为:"<<endl; DisplayPoly(headla); cout<<"多项式headlb的数据为:"<<endl; DisplayPoly(headlb); AddPolynomial(headla,headlb);//将两多项式相加,新链表头结点为headla cout<<"两多项式相加的结果为:"<<endl; DisplayPoly(headla);//这里的headla是新链表的头结点,不是旧链表的头结点 return 1; }
相关文章推荐
- //单链表1-求两个多项式的加法
- PTA 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。
- 链表实现两个多项式的加法
- Java数据结构之多项式加法和乘法实现
- 用加法实现两个整数乘法操作
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 单链表的使用——计算多项式加法
- POJ 多项式加法
- 多项式加法-week7-C语言习题集
- 基于c数据结构——实现多项式合并同类项,加法和乘法
- 顺序结构、动态链表结构下的一元多项式的加法、减法等的实现
- 两个大整数加法
- 多项式加法(10分)
- 用单向链表实现一元多项式加法 推荐
- 链表存储的多项式加法
- 【九度】题目1472:求两个多项式的和
- 求二进制的加法,输入两个四位二进制数,求其和(二进制表示)。
- PTA 数据结构 一元多项式的乘法与加法运算 (仅供参考,请勿粘贴)
- 浙大PAT 3-04. 一元多项式的乘法与加法运算 (解题思路)
- 习题3.6 一元多项式的乘法与加法运算