您的位置:首页 > 编程语言 > C语言/C++

一元多项式加减法运算[C语言]

2017-05-04 15:50 295 查看
最近写了一元多项式的加减法,发现一些问题,在此记录下来.

主要是减法运算,在做减法时:

当两项的指数相同时,系数就是两项系数的差值;

但是如果两项的指数不相等时,则分两种情况,看谁的指数较小:

被减数的指数较小

这时候结果的系数和被减数的系数一样

减数的指数较小

这个时候结果的系数就要在减数系数的基础上再加一个’负号’.

Status PolynomialSubtract(Polynomial * Poly_A, Polynomial * Poly_B, Polynomial * Poly_C)//完成一元多项式的减法操作
{
//定义两个指针,依次遍历Poly_A和Poly_B:比较两个指数的大小,分两种情况:
//指数相等:新开辟一个新结点,系数就是刚才的两个系数的差值,指数就是刚才的指数,两个指针都要后移一位
//特殊点在于如果系数相减之后为零,就不用创建新结点了,只让两个指针后移就可以了
//指数不相等:新开辟一个结点,数据域和指数较小的那项的数据域一样,较小的那一项的指针后移一位,另一个指针不动
LNode * p = Poly_A->top->next;//p指向多项式A的第一项
LNode * q = Poly_B->top->next;//q指向多项式B的第一项
LNode * pNew = NULL;//指向新结点

while ( (p != NULL) && (q != NULL) )
{
//判断是否需要开辟新结点
if ( ((p->data.expn) == (q->data.expn)) && ((p->data.coefficient) == (q->data.coefficient)) )
{
//如果指数和系数都相等,就不用开辟新结点了,直接让指针后移就可以了
p = p->next, q = q->next;
continue;
}

//否则开辟新结点
pNew = (LNode *) malloc (sizeof(LNode));
if (pNew == NULL)
{
exit(OVERFLOW);
}

//设置新结点的数据域属性
if ((p->data.expn) == (q->data.expn))
{
//指数相等时,新结点的系数是两者系数的差值
pNew->data.coefficient = p->data.coefficient - q->data.coefficient;//A-B
//指数和两者的指数相等
pNew->data.expn = p->data.expn;

//指针后移
p = p->next, q = q->next;
}
else
{
//指数不相等的时候,新结点所有属性复制指数较小的那一项的属性,同时较小的那一项的指针后移,另一个指针不后移
//但是复制系数的时候,如果复制的是被减数,系数一致,但如果是减数,系数要加负号
pNew->data.coefficient = ((p->data.expn) < (q->data.expn)) ? (p->data.coefficient) : -(q->data.coefficient);
pNew->data.expn = ((p->data.expn) < (q->data.expn)) ? (p->data.expn) : (q->data.expn);

//指针后移
((p->data.expn) < (q->data.expn)) ? (p = p->next) : (q = q->next);
}

//设置新结点的指针域属性,即将新结点pNew链接到一元多项式里面
pNew->next = NULL;//新结点作为新的尾节点,所以指针域要赋值为空
Poly_C->end->next = pNew;//将新结点追加到一元多项式里面
Poly_C->end = pNew;//尾指针后移
++(Poly_C->length);//长度加一
}

//退出循环之后, A B中肯定有一个已经遍历结束了,那么将没有遍历完的多项式剩下的项追加到多项式 C 里面
if (p == NULL)//如果是 A 遍历结束了,即被减数遍历结束了
{
//就将 B 剩下的项全部加到 C 里面,即复制 减数, 系数要加负号
while (q != NULL)//此时 q 指向的就是剩下所有项中的第一项
{
//开辟新结点
pNew = (LNode *) malloc (sizeof(LNode));

//设置新结点的数据域属性
pNew->data.coefficient = -(q->data.coefficient);//系数要加负号
pNew->data.expn = q->data.expn;//指数相同

//指针后移
q = q->next;

//设置新结点的指针域属性,即将新结点pNew链接到一元多项式里面
pNew->next = NULL;//新结点作为新的尾节点,所以指针域要赋值为空
Poly_C->end->next = pNew;//将新结点追加到一元多项式里面
Poly_C->end = pNew;//尾指针后移
++(Poly_C->length);//长度加一
}
}
else//如果是 B 遍历结束了,说明 减数 遍历完了
{
//就将 B 剩下的项全部加到 C 里面, 即复制的是: 被减数, 系数相同
while (p != NULL)//此时 q 指向的就是剩下所有项中的第一项
{
//开辟新结点
pNew = (LNode *) malloc (sizeof(LNode));

//设置新结点的数据域属性
pNew->data.coefficient = p->data.coefficient;//系数相同
pNew->data.expn = p->data.expn;//指数相同

//指针后移
p = p->next;

//设置新结点的指针域属性,即将新结点pNew链接到一元多项式里面
pNew->next = NULL;//新结点作为新的尾节点,所以指针域要赋值为空
Poly_C->end->next = pNew;//将新结点追加到一元多项式里面
Poly_C->end = pNew;//尾指针后移
++(Poly_C->length);//长度加一
}
}

return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: