多项式加法的实现
程序员文章站
2022-07-03 18:26:34
...
//采用不带头结点的单向链表,按照指数递减的顺序排列各项
//思路:俩个指针P1P2分别指向这两个多项式的第一个结点,不断循环
#include<stdio.h>
#include<stdlib.h>
struct PolyNode {
int coef;//系数
int expon;//指数
struct PolyNode *link;//指向下一节点的指针
};
typedef struct PolyNode *Polynomial;
Polynomial P1, P2;
int Compare(int a, int b) {
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0;
}
void Attach(int c, int e, Polynomial *pRear) {//三个参数传进来系数和指数,告诉当前最后一个结点的指针的位置,传进来Polynomial这个类型的指针,
//但是注意Polynomial本身也是指针,所以pRear是指针的指针,函数操作的自传递
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expon = e;
P->link = NULL;
(*pRear)->link = P;//把新生成的结点P插到Rear后边
*pRear = P;
}
Polynomial PolyAdd(Polynomial P1, Polynomial P2) {
Polynomial front, rear, temp;//记住结果多项式的头和尾
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));//构造临时空结点作为结果多项式的表头,返回时要释放
front = rear;
while (P1&&P2) {//当P1、P2都不空
switch (Compare(P1->expon, P2->expon)) {//比较P1P2指向指数的大小,Compare函数比较,第一个值大返回1,第二个值大返回-1,相等返回0
case1://P1当前指向的指数大
Attach(P1->coef, P1->expon, &rear);//Attach拷贝过程,第一第二个参数代表分别要拷贝的系数和指数,把系数和指数形成的新的项拷贝到rear后边,然后P1往后挪
P1 = P1->link;
break;
case -1://P2当前指向的指数大
Attach(P2->coef, P2->expon, &rear);
P2 = P2->link;
break;
case 0://两个指数相等只需把系数相加
sum = P1->coef + P2->coef;
if (sum)//如果系数为0则不用加入到结果多项式中
Attach(sum, P1->expon, &rear);//sum不为0则把sum作为系数放到结果多项式中,P1P2都往后挪
P1 = P1->link;
P2 = P2->link;
break;
}
//当循环退出的时候就说明P1P2中至少有一个为空
for (; P1; P1 = P1->link)//如果P1不空则P2空,就把P1后边的每一项都接到结果多项式的后边,同时把P1往后挪
Attach(P1->coef, P1->expon, &rear);
for (; P2; P2->link)
Attach(P2->coef, P2->expon, &rear);
//两个for做完则说明两多项式相加基本完成
rear->link = NULL;//加完之后rear后边没有了设为NULL
temp = front;//front原来指向临时的表头结点,要把临时的表头结点释放掉释放掉,他的下一项就是就是真正的多项式的第一项,所以把它的值赋给temp,它本身往后挪最后返回他
front = front->link;
free(temp);
return front;
}
}