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

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
	} //while
	if (! ListEmpty(*Pb))
	{
		(*Pb).tail = hb;
		Append(Pa, qb);//链接Pb中剩余结点
	}
	DestroyPolyn(Pb);//销毁Pb
 }

 void PolynMultiply(polynomial *Pa, polynomial *Pb)
 {
 	//多项式乘法:Pa=Pa*Pb,并销毁一元多项式Pb
	polynomial 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;
	}//while
	DestroyPolyn(Pb);//销毁Pb
	ClearList(Pa);//将Pa重置为空表
	(*Pa).head = Pc.head;
	(*Pa).tail = Pc.tail;
	(*Pa).len = Pc.len;
 }


3.4调试运行如下所示:

相加的结果

数据结构和算法C语言实现:使用链表实现稀疏多项式_第1张图片

相减的结果

数据结构和算法C语言实现:使用链表实现稀疏多项式_第2张图片

相乘的结果

数据结构和算法C语言实现:使用链表实现稀疏多项式_第3张图片


你可能感兴趣的:(C语言数据结构和算法)