一元多项式加减法运算[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; }
相关文章推荐
- PAT 3-04 一元多项式的乘法与加法运算(C语言实现)
- C语言实现一元多项式的加减运算
- 一元多项式的乘法运算(C语言)实现
- 02-线性结构2 一元多项式的乘法与加法运算 (20分)
- 一元多项式的加减法 C++实现
- 一元多项式及其运算
- 华为面试题:一元多项式的化简 C语言实现源码
- 习题3.6 一元多项式的乘法与加法运算
- 多个有序链表的合并[续]---一元多项式的乘法与加法运算
- 02-线性结构2 一元多项式的乘法与加法运算
- 2-11-一元多项式运算-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 5-2 一元多项式的乘法与加法运算 (20分)
- 5-2 一元多项式的乘法与加法运算
- PAT 一元多项式的乘法与加法运算(20)(模拟计算过程)
- 线性结构2 一元多项式的乘法与加法运算
- Programming Ability Test学习 3-04. 一元多项式的乘法与加法运算(20)
- 一元多项式的加减法(C++版)
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 5-1 一元多项式的乘法与加法运算 (20分)
- PTA--一元多项式的乘法与加法运算