多项式的加法运算
多项式相加:相同指数的系数项相加,其余部分进行拷贝。
法一:采用不带头结点的单项链表,按照指数递减的顺序排列各项
链表的定义:
#include <stdio.h> #include <stdlib.h> struct PolyNode{ int coef; //多项式系数 int expon; //多项式指数 struct PolyNode *Link; }; PolyNode P1, P2; typedef struct PolyNode *Polynomial;
多项式加法实现思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环,当某一多项式处理完时,将另一个多项式的所有结点一次复制到结果多项式中去。
int Compare(int expon1,int expon2) //判断多项式1和多项式2指数大小 { if (expon1 > expon2) return 1; else if (expon1 < expon2) return -1; else return 0; } void Attach(int coef, int expon, Polynomial *pRear) { Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); //申请新结点 P->coef = coef; //对新结点赋值系数 P->expon = expon; //对新结点赋值指数 P->Link = NULL; //构成完整的新结点 (*pRear)->Link = P; //将P指向的新结点插入到结果多项式的尾部 *pRear = P; //将P新结点的值给到结果多项式中 } Polynomial PolyAdd(Polynomial P1, Polynomial P2) { Polynomial front, rear, temp; int sum; rear = (Polynomial)malloc(sizeof(PolyNode)); front = rear; //由front记录结果多项式链表头结点 while (P1&&P2) //当两个多项式都有非零项待处理时 { switch (Compare(P1->expon, P2->expon)) { case 1: Attach(P1->coef, P1->expon, &rear); //P1多项式中指数项比较大,放到结果多项式中 P1 = P1->Link; break; case 2: Attach(P2->coef, P2->expon, &rear); //P2多项式中指数项比较大,放到结果多项式中 P2 = P2->Link; break; case 3: sum = P1->coef + P2->coef; // //P1和P2多项式中指数项一样大 if (sum) //判断系数和是否为零,如果为零,直接跳过 { Attach(sum, P1->expon, &rear); } P1 = P1->Link; P2 = P2->Link; break; } } //此时,要么P1处理完毕,要么P2处理完毕 for (; P1; P1 = P1->Link){ //如果P1未处理完,放入结果多项式中 Attach(P1->coef, P1->expon, &rear); } for (; P2; P2->Link){ //如果P2未处理完,放入结果多项式中 Attach(P2->coef, P2->expon, &rear); } rear->Link = NULL; //收尾工作,将尾指针指向NULL temp = front; front = front->Link; //front指向结果多项式的第一个非零项 free(temp); //释放掉临时空表头结点 return front; //表头结点 }
(四)线性结构练习:多项式的加法和乘法运算
最新推荐文章于 2022-05-09 17:45:44 发布