数据结构和算法C语言实现:使用链表实现稀疏多项式

来源:互联网 发布:淘宝 html5 编辑:程序博客网 时间:2024/05/17 02:49

1、前面讲了如何使用动态分配内存的方式创建ADT链表,但是链表只是一种数据结构,涉及到具体的应用时,我们需要根据具体的要求来对链表进行一定的修改,这地方我使用多项式的例子来进行讲解。

2、涉及到链表的相关的操作前面已经进行了细致的讲解,这里不再多说。对于多项式,要满足+、—、*、/、四则基本运算。使用链表作为多项式的存储结构,实现上述四则基板运算是今天的目标。

3、链表的构建

3.1 多项式的每一项由系数和指数构成,首先需要构建满足这一要求的结构体:

typedef struct //项的表示,多项式的项作为LinkList的数据元素 {     float coef;//系数     int expn;//指数 }Item, ElemType;//两个类型名:Item用于这个ADT(抽象数据类型)
 以上面的数据类型,构建节点类型,形成链表的基本节点

typedef struct _LinkNode /* 结点类型 */ {   ElemType data;   struct _LinkNode *pNext; }LNode,*pLink,*Position;
最终构建出如下的链表

 typedef struct LinkList /* 链表类型 */ {   pLink head,tail; /* 分别指向线性链表中的头结点和最后一个结点 */   int nLenth; /* 指示线性链表中数据元素的个数 */ }LinkList; typedef LinkList polynomial;


3.2  多项式的算法定义如下:

void PolynAdd(polynomial *Pa, polynomial *Pb);//多项式的加法void PolynSubstract(polynomial *Pa, polynomial *Pb);//多项式的减法void PolynMultiply(polynomial *Pa, polynomial *Pb);//多项式的乘法


3.3具体实现如下所示:

 void PolynAdd(polynomial *Pa, polynomial *Pb) { Position ha, hb, qa, qb; term a, b; ha = GetHead(*Pa); hb = GetHead(*Pb);//ha和hb分别指向Pa和Pb的头结点//qa和qb分别指向Pa和Pb中当前结点(现在是第一个结点)qa = NextPos(ha);qb = NextPos(hb);while ( (!ListEmpty(*Pa)) && (!ListEmpty(*Pb)) && qa ){//Pa和Pb均非空且ha没指向尾结点(qa!=0)a = GetCurElem(qa);b = GetCurElem(qb);//a和b为两表中当前比较元素switch ( cmp(a, b) ){case -1:{ha = qa;//多项式 Pa中当前结点的指数值小qa = NextPos(ha);//ha和qa均向后移一个结点}break;case 0:{//两者的指数值相等 ,修改Pa当前结点的系数值qa->data.coef += qb->data.coef;if ( (qa->data.coef) == 0 )//删除多项式Pa中当前结点{DelFirst(Pa, ha, &qa);FreeNode(&qa);}else{ha = qa;}DelFirst(Pb, hb, &qb);FreeNode(&qb);qb = NextPos(hb);qa = NextPos(ha);}break;case 1:{DelFirst(Pb, hb, &qb);//多项式Pb中当前结点的指数值小InsFirst(Pa, ha, qb);ha = ha->next;qb = NextPos(hb);}break;} //switch} //whileif (! ListEmpty(*Pb)){(*Pb).tail = hb;Append(Pa, qb);//链接Pb中剩余结点}DestroyPolyn(Pb);//销毁Pb }

 void PolynMultiply(polynomial *Pa, polynomial *Pb) { //多项式乘法:Pa=Pa*Pb,并销毁一元多项式Pbpolynomial Pc;Position qa, qb;term a, b, c;InitList(&Pc);qa = GetHead(*Pa);qa = qa->next;while (qa){a = GetCurElem(qa);qb = GetHead(*Pb);qb = qb->next;while (qb){    b = GetCurElem(qb);    c.coef = a.coef * b.coef;c.expn = a.expn + b.expn;OrderInsertMerge(&Pc, c, cmp);qb = qb->next;}qa = qa->next;}//whileDestroyPolyn(Pb);//销毁PbClearList(Pa);//将Pa重置为空表(*Pa).head = Pc.head;(*Pa).tail = Pc.tail;(*Pa).len = Pc.len; }


3.4调试运行如下所示:

相加的结果



相减的结果



相乘的结果



0 0