1、返回L中第1个与e满足关系cmp()的元素的位序。 若这样的元素不存在,则返回值为0。SetCurElem(&p, e) 线性表L已存在,且非空。用元数e更新p所指结点中元数的值。GetCurElem(p)返回p所指结点中数据元数的值。InsFirst (&L, h, s) 线性表L已存在,h结点在L中。在L的s所指结点插入在h结点之后,L的长度加1。 DelFirst (&L, h, q) 线性表L已存在且非空,q结点在L中且不是尾结点 删除链表L中的h结点之后的结点q,L的长度减1。MakeNode(&p, e)创建了一个结点p,其data部分为e。FreeNode(&p)结点p存在且非空
2、。释放结点p空间。Append(LinkList &L,Link s)s及s以后的结点链接到了原L之后,L的长度增加链上的结点数。ListEmpty(L)若线性链表L为空表,则返回TRUE,否则返回FALSE。GetHead(L)返回线性链表L中头结点的位置。NextPos(L, p)返回p所指结点的直接后继的位置,若没后继,则返回NULL。int cmp(a, b)存在两个元数。比较a,b的数值,分别返回-1,0,1。 ADT LinkList2.一元多项式的抽象数据类型定义为:ADT PolynomialD ai | aiTermSet, i=1,2,.,m, m0 TermSet中的每个
3、元素包含一个表示系数的实数和表示指数的整数|ai-1, aiD, 且ai-1中的指数值next=L.tail-next=NULL; return OK;/ 返回线性表L中头结点的位置。Position GetHead(LinkList &/已知p指向线性链表L中的一个结点,返回p所指结点的直接后驱的位置/若无后继,返回NULLPosition Nextpos(LinkList &L,Link p);/已知p指向线性表L中的一个结点,返回p所指结点中数据元素的值。ElemType GetCurElem(Link p);/已知p指向线性链表L中的一个结点,用e更新p所指结点中数据元素的值。Stat
4、us SetCurElem(Link &p,float e); /已知h指向线性链表的某个结点,将q所指的结点插入在h之后。Status InsFirst(Link h,Link q); s-next=h-next; h-next=s; L.len+; if(!s-next) L.tail=s;/已知h指向线性链表的头结点,删除线性链表第一个指结点并以q返回Status DelFirst(Link h,Link &q);/若线性链表L为空,则返回TRUE,否则返回FALSE。Status ListEmpty(LinkList L); if(L.head=L.tail=NULL) return
5、TRUE; else return FALSE;/将指针s所指的一连串结点连接在线性表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点。Status Append(polynomial &L,Link s); i=0; q=s; while(s) /找到新的tail,计数s长度 p=s; s=s- i+; L.tail-next=q; L.tail=p; L.len+=i;/判断已知链表中,是否存在相同的元素e,若存在返回TURE,且q指示L中第一个与e相同的结点元素;/否则返回FALSE,并q指示L中第一个稍大于e的元素的直接前驱的位置Status LocateElem(LinkLi
6、st L,ElemType e,Position & p=L.head; while(p-next) s=p; p=p- m=p-data; if(cmp(e,m )=0) q=p; return FALSE;/整表删除void ClearList(LinkList & if(L.head!=L.tail) p=q=L.head- while(p! p=q- free(q); L.tail=L.head;/依a的指数值)b的指数数值,分别返回-1,0,+1int cmp(term a, term b) ; if(a.expn return 1;3.基于多项式的操作(部分伪码如下)/输入m项的系
7、数和指数,建立表示一元多项式的有序链表Pvoid CreatPolyn(polynomial &p,int m);InitList(p);h=GetHead(p);e.coef=0.0;e.expn=-1;SetCurElem(h,e);for(int i=1;i=m;i+) coute.coefe.expn;endl;LocateElem(p,e,q)/当前链表中不存在该指数项 if(MakeNode(s,e) InsFirst(p,q,s);/生成节点并插入链表 else return; else q-data.coef+=e.coef; +c; m=m-c;/销毁一元多项式Pvoid D
8、estroyPolyn(polynomial & while(p.head -next!=NULL) k=p.head; p.head =p.head - free(k); free(&/打印输出一元多项式Pvoid PrintPolyn(polynomial p);ha=GetHead(p);coutm, for(int i=1;i+) qa=NextPos(p,ha); e=GetCurElem(qa);e.coef,e.expn hc=GetHead(Pc); while(qa) a=GetCurElem(qa); qb=GetHead(Pb); qb=qb- while(qb) b=G
9、etCurElem(qb); c.coef=a.coef*b.coef; c.expn=a.expn+b.expn; MakeNode(qc,c); InsFirst(Pc,hc,qc); hc=NextPos(Pc,hc); qc=NextPos(Pc,qc); DestroyPolyn(Pb); ClearList(Pa); Pa.head=Pc.head; Pa.tail=Pc.tail; Pa.len=Pc.len;/计算多项式在x处的值double Evaluation(double x, polynomial p);/计算多项式P的导函数Pvoid Derivative( poly
10、nomial &p ); InitList(Pb); hb=GetHead(Pb); b.coef=a.coef*a.expn; b.expn=a.expn-1; MakeNode(qb,b); InsFirst(Pb,hb,qb); hb=NextPos(Pb,hb); qb=NextPos(Pb,qb); qb=NULL; Pa.head=Pb.head; Pa.tail=Pb.tail; Pa.len=Pb.len;4.主函数和其他函数的伪码算法int main() Initialization(); ReadCommand(cmd); while (cmd != q & cmd !Q)
11、 Interpret(cmd); display(); ReadCommand(cmd);void Initialization() pre_cmd = cmd = InitList(La); InitList(Lb);void display() system(cls); /清屏在屏幕上方显示操作命令清单:CreatePolynomial_a -1 CreatePolynomial_b -2 a+b - a-b a*b -* Derivation of a -d Calculate a in x -c Quit -q 在屏幕下方显示操作命令提示框:Enter a operation code
12、(1,2,+,_,*,c,d OR q): void ReadCommand(char &cmd) /读入操作命令符 显示检入操作命令符的提示信息; do cin cmd; while (!strchr(cmdsets, cmd);void Interpret(char cmd) /解释执行操作命令cmd switch (cmd) case 1: ClearList(La); cout 请输入第一个一元多项式的项数 n; cout endl; CreatPolyn(La, n);/输入多项式 SortPolyn(La); break;2 ClearList(Lb); endl 请输入第二个一元
13、多项式的项数 m; CreatPolyn(Lb, m); SortPolyn(Lb);+两多项式相加的结果: AddPolyn(La, Lb); PrintPolyn(La, La.len); Expression(La,La.len); getchar();-两多项式相减的结果: SubtractPolyn(La, Lb);*两多项式相乘的结果: MultiplyPolyn(La, Lb);cC请输入x的值 x;多项式a在 x 处的值为 CalPolyn(La, x);dD DerivPolyn(La);求导结果为 default:输入错误 5.函数的调用关系图反映了演示程序的层次结构四、调试分析1.一开始写求导部分代码时没有考虑常数项求导变零的情况,结果输出后常数项以系数为0指数为-1的形式输出,不符合规范。调试后加入if判断语句让常数项求导
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1