// c2-6.h 抽象数据类型Polynomial的实现见图2.45) typedef struct // 项的表示,多项式的项作为LinkList的数据元素 { float coef; // 系数 int expn; // 指数 }term,ElemType; // 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名
图246 是根据c2-5.h 和c2-6.h 定义的多项式7.3+22X7 的存储结构。
// bo2-7.cpp 多项式存储结构由c2-6.h定义)的基本操作及算法2.22,2.23等8个) #include"c2-5.h" #include"bo2-6.cpp" typedef LinkList polynomial; #define DestroyPolyn DestroyList // 与bo2-6.cpp中的函数同义不同名 #define PolynLength ListLength // 与bo2-6.cpp中的函数同义不同名 void OrderInsertMergeLinkList &L,ElemType e,int* compare)term,term)) { // 按有序判定函数compare)的约定,将值为e的结点插入或合并到升序链表L的适当位置 Position q,s; ifLocateElemL,e,q,compare)) // L中存在该指数项 { q->data.coef+=e.coef; // 改变当前结点系数的值 if!q->data.coef) // 系数为0 { // 删除多项式L中当前结点 s=PriorPosL,q); // s为当前结点的前驱 if!s) // q无前驱 s=L.head; DelFirstL,s,q); FreeNodeq); } } else // 生成该指数项并插入链表 { MakeNodes,e); // 生成结点 InsFirstL,q,s); } } int cmpterm a,term b) // CreatPolyn)的实参 { // 依a的指数值<、=或>b的指数值,分别返回-1、0或+1 ifa.expn==b.expn) return 0; else return a.expn-b.expn)/absa.expn-b.expn); } void CreatPolynpolynomial &P,int m) // 算法2.22 { // 输入m项的系数和指数,建立表示一元多项式的有序链表P Position q,s; term e; int i; InitListP); printf"请依次输入%d个系数,指数: ",m); fori=1;i<=m;++i) { // 依次输入m个非零项可按任意顺序) scanf"%f,%d",&e.coef,&e.expn); if!LocateElemP,e,q,cmp)) // 当前链表中不存在该指数项,cmp是实参 { MakeNodes,e); // 生成结点并插入链表 InsFirstP,q,s); } } } void PrintPolynpolynomial P) { // 打印输出一元多项式P Link q; q=P.head->next; // q指向第1个结点 printf" 系数指数 "); whileq) { printf"%f %d ",q->data.coef,q->data.expn); q=q->next; } } void AddPolynpolynomial &Pa,polynomial &Pb) // 算法2.23 { // 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb Position ha,hb,qa,qb; term a,b; ha=GetHeadPa); hb=GetHeadPb); // ha和hb分别指向Pa和Pb的头结点 qa=NextPosha); qb=NextPoshb); // qa和qb分别指向Pa和Pb中当前结点现为第1个结点) while!ListEmptyPa)&&!ListEmptyPb)&&qa) { // Pa和Pb均非空且ha没指向尾结点qa!=0) a=GetCurElemqa); b=GetCurElemqb); // a和b为两表中当前比较元素 switchcmpa,b)) { case -1:ha=qa; // 多项式Pa中当前结点的指数值小 qa=NextPosha); // ha和qa均向后移1个结点 break; case 0: qa->data.coef+=qb->data.coef; // 两者的指数值相等,修改Pa当前结点的系数值 ifqa->data.coef==0) // 删除多项式Pa中当前结点 { DelFirstPa,ha,qa); FreeNodeqa); } else ha=qa; DelFirstPb,hb,qb); FreeNodeqb); qb=NextPoshb); qa=NextPosha); break; case 1: DelFirstPb,hb,qb); // 多项式Pb中当前结点的指数值小 InsFirstPa,ha,qb); ha=ha->next; qb=NextPoshb); } } if!ListEmptyPb)) { Pb.tail=hb; AppendPa,qb); // 链接Pb中剩余结点 } DestroyPolynPb); // 销毁Pb } void AddPolyn1polynomial &Pa,polynomial &Pb) { // 另一种多项式加法的算法:Pa=Pa+Pb,并销毁一元多项式Pb Position qb; term b; qb=GetHeadPb); // qb指向Pb的头结点 qb=qb->next; // qb指向Pb的第1个结点 whileqb) { b=GetCurElemqb); OrderInsertMergePa,b,cmp); qb=qb->next; } DestroyPolynPb); // 销毁Pb } void Oppositepolynomial Pa) { // 一元多项式Pa系数取反 Position p; p=Pa.head; whilep->next) { p=p->next; p->data.coef*=-1; } } void SubtractPolynpolynomial &Pa,polynomial &Pb) { // 多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb OppositePb); AddPolynPa,Pb); } void MultiplyPolynpolynomial &Pa,polynomial &Pb) { // 多项式乘法:Pa=Pa×Pb,并销毁一元多项式Pb polynomial Pc; Position qa,qb; term a,b,c; InitListPc); qa=GetHeadPa); qa=qa->next; whileqa) { a=GetCurElemqa); qb=GetHeadPb); qb=qb->next; whileqb) { b=GetCurElemqb); c.coef=a.coef*b.coef; c.expn=a.expn+b.expn; OrderInsertMergePc,c,cmp); qb=qb->next; } qa=qa->next; } DestroyPolynPb); // 销毁Pb ClearListPa); // 将Pa重置为空表 Pa.head=Pc.head; Pa.tail=Pc.tail; Pa.len=Pc.len; }
// main2-7.cpp 检验bo2-7.cpp的主程序 #include"c1.h" #include"c2-6.h" #include"bo2-7.cpp" void main) { polynomial p,q; int m; printf"请输入第1个一元多项式的非零项的个数:"); scanf"%d",&m); CreatPolynp,m); printf"请输入第2个一元多项式的非零项的个数:"); scanf"%d",&m); CreatPolynq,m); AddPolynp,q); printf"2个一元多项式相加的结果: "); PrintPolynp); printf"请输入第3个一元多项式的非零项的个数:"); scanf"%d",&m); CreatPolynq,m); AddPolyn1p,q); printf"2个一元多项式相加的结果另一种方法): "); PrintPolynp); printf"请输入第4个一元多项式的非零项的个数:"); scanf"%d",&m); CreatPolynq,m); SubtractPolynp,q); printf"2个一元多项式相减的结果: "); PrintPolynp); printf"请输入第5个一元多项式的非零项的个数:"); scanf"%d",&m); CreatPolynq,m); MultiplyPolynp,q); printf"2个一元多项式相乘的结果: "); PrintPolynp); DestroyPolynp); }
运行结果如下: