数据结构-第2章线性表-1剖析
while(pa!=NULL pb!=NULL){ q=(JD* )malloc (sizeof(JD)); 例题4算法 else { q-data=pa-data; pa=pa-link; if (pb-datapa-data) {q-data=pb-data; pb=pb-link;} if (pa-data==pb-data) pb=pb-link;} p-link=q; p=q;} while(pa!=NULL) { q=(JD*)malloc(sizeof(JD)); q-data=pa-data; pa=pa-link; 例题4算法 p-link=q; p=q; } While(pb!=NULL) { q=(JD*)malloc(sizeof(JD)); 例题4算法 q-data=pb-data; pb=pb-link; p-link=q; p=q;} p-link=NULL p=pc; pc=p-link; free(p) return(pc);} 从本节的讨论中可见:由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。 然而它也存在着实现某些基本操作如求线性表长度时不如顺序存储结构的缺点; 为此,从实际应用角度出发重新定义线性链表及其基本操作(见P37~38)。 另一方面,由于在链表中,节点之间的关系用指针来表示,则数据元素在线性表中的“位序”的概念已淡化,而被数据元素在线性表链表中的“位置”所代替。 多项式的运算问题,已经成为表处理的一个经典问题。通常一个多项式Pn(x)可按升幂写成: 2.4一元多项式相加 它由n+1个系数唯一确定。在计算机里,它可用一个线性表P来表示: 每一项的指数i隐含在其系数pi的序号里。 假设Qm(x)是一元m次多项式,同样可用线性表Q来表示: 假设mn,则两个多项式相加的结果Rn(x)=Pn(x)+Qm(x)可用线性表R表示: 我们可以对P、Q和R采用顺序存储结构,使得多项式相加的算法定义十分简洁。 至此,一元多项式的表示及相加问题似乎已经解决。然而,在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。特别是在处理时的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。特别是在处理形如: 2.4一元多项式相加 的多项式时,就要用一长度为20001的线性表来表示,表中仅有3个非零元素,这种对内存空间浪费应当避免。 其中,pi是指数为ei的项的非零系数,且满足: 但是如果只存储非零系数项,显然必须同时存储相应的指数。一般情况下的一元n次多项式可写成: 若用一个长度为m且为每个数据元素有两个数据项(系数项和指数项)的线性表 2.4一元多项式相加 便可唯一确定多项式Pn(x)。在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多一倍的数据。但是,对于S(x)类的多项式,这种表示将大大节省空间。 对应于线性表的两种存储结构,由上式定义的一元多项式也可以有两种存储表示方法。在实际的应用程序中取用哪一种,则要视多项式作何种运算而定。 若只对多项式进行“求值”等不改变多项式的系数和指数的运算,则采用类似于顺序表的顺序存储结构即可,否则应采用链式存储结构。本节中将主要讨论如何利用线性链表的基本操作来实现一元多项式的运算。 typedef struct node { int coef,exp; struct node *next;}JD; coef exp next -1 A 7 0 3 1 9 8 5 17 ^ -1 B 8 1 22 7 -9 8 ^ -1 C 7 0 11 1 22 7 5 17 ^ 2、一元多项式相加 1、单链表的结点定义 设p,q分别指向A,B中某一结点,p,q初值是第一结点 比较 p-exp 与 q-exp p-exp q-exp: p结点是和多项式中的一项, p后移,q不动 p-exp q-exp: q结点是和多项式中的一项, 将q插在p之前,q后移,p不动 p-exp = q-exp:系数相加 0:从A表中删去p, 释放 p,q,p,q后移 ?0:修改p系数域, 释放q,p,q后移 直到p或q为NULL 若q==NULL,结束 若p=
原创力文档

文档评论(0)