开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
2.4 多项式的加法运算实现
采用不带头结点的单项链表,按照指数递减的顺序排列各项
具体实现代码(数据结构)
struct PolyNode{
int coef;//系数
int expon;//指数
struct PolyNode link;//指向下一个节点的指针
};
typedef struct PolyNode*Polynomial;
Polynomial P1,P2;
多项式加法运算(算法思路):
两个指针p1和p2分别指向这两个多项式第一个结点,不断循环:
1. P1->expon == P2 -> expon(这里比较的其实是指数):系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1和P2都分别指向下一项
2. P1->expon > P2 -> expon:将P1的当前项存入结果多样式,并使P1指向下一项;
3. P1->expon < P2 -> expon:将P2的当前项存入结果多样式,并使P2指向下一项;
当某一多项式处理完时,将另一个多项式的所有结点依次复制到结果多项式中去
演变过程------------------------分割线
接着是=>
函数实现
Polynomial PolyAdd(Polynomial P1.Polynomial P2)
{
Polynomial front,rear,temp;//多项式的头是第一个,尾巴第二个,
int sum;
rear = (Polynomial) malloc(sizeof(struct PolyNode));//临时申请一个空结点作为结果多项式的表头
front = rear;//由front记录结果多项式链表头结点,申请的空间front都指向它
while(P1 && P2)//当两个多项式都有非零待处理时(判空)
switch(Compare(P1->expon,P2->expon)){//比较P1P2这两个项的所指向的当前这个项的指数,第一个值大返回1,第二个值大返回-1,两个值相等返回0
case1://P1大
Attach(P1->coef,P1->expon,&rear);//两个参数分别代表我要拷贝的这一项的系数和指数
P1 = P1 -> link;
break;//形成的新的项把它接到rear的后面,P1往后挪
case-1://P2大
Attach(P2->coef,P2->expon,&rear);
P2 = P2 -> link;
break;
case0://一样大
sum = P1->coef + P2->coef;
if(sum)Attach(sum.P1->expon,&rear);//判定,如果为0就不用加到结果多项式里面去,不为零就把sum作为系数跟对于的指数凑在一起,把他接到rear的后面去
P1 = P1 -> link;
P2 = P2 -> link;
break;
}
//将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
for(;P1;P1 = P1 -> link) Attach(P1->coef,P1->expon,&rear);//第一个for循环处理P1不空,如果不空就是把P1后面的每一项全部Attach(接到结果多项式的后面的意思),同时把P1往后挪
for(;P2;P2 = P2 -> link) Attach(P2->coef,P2->expon,&rear);//如果P1不空的话P2肯定就空了,也就把P2后面的每一项一个一个拷贝到rear的后面去
rear ->link = NULL;//指向结果多项式的最后一项
temp = front;
front = front -> link;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头结点 怎么释放?=>将front赋给temp,然后front往后挪,front原来是指向这个临时的表头结点,这个表头结点的下一项就是我们真正的多项式的第一项
return front;//返回结果多样式中这个单项链表的第一个结点
}
问题:如果当前p1指向项的(系数,指数)为(2,4),同时P2指向项为(2,6),那么循环中的switch是执行哪个case?
case -1
Attach实现
void Attach(int c,int e,Polynomial*pRear)//传进来的是c跟e的系数跟指数。当前最后一个结点的指针位置传进来的是Polynomial这个类型的指针(Polynomial本身也是指针),所以pRear实际上是指针的指针
//C语言是函数常数值传递
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PloyNode));//结点类型是struct PolyNode这个类型
P -> coef = c;//对新结点赋值
P -> expon = e;
P -> link = NULL;
(*pRear)->link = P;//把新申请的结点P插到rear的后面
*pRear = P;//修改pRear值
}