多项式的加法(单向链表)
2017-07-27 本文已影响0人
日常表白结衣
采用不带头节点的单向链表,按照指数递减的顺序排列各项
/* 定义链表 */
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记录结果多项式链表头节点
while(P1&&P2) //当两个多项式都由非零项待处理时
switch(Compare(P1->expon,P2->expon)){
case 1:
Attach(P1->coef,P1->coef,&rear); //拷贝函数,结果接到rear地址的后面
P1=P1->link; //P1指向下一项
break;
case -1:
Attach(P2-coef,P1->expon,&rear);
P2=P2->link;
break;
case 0:
sum = P1->coef+P2->coef;
if(sum)
Attach(sum,P1->expon,&rear); //不为0,接到rear地址后面
//指针依次顺延
P1=P1->link;
P2=P2->link;
break;
}
//某一个多项式已经处理完成,把另一个多项式接到rear地址后面
for(;P1;P1=P1->link) Attach(P1->coef,P1->expon,&rear); //P1不空则执行Attach并指针后延
for(;P2;P2=P2->link) Attach(P2->coef,P2->expon,&rear);
//函数操作已完成
rear->link=NULL;
temp=front;
front=front->link; //指向结果多项式第一个非零项
free(temp);
return front;
}
/* 拷贝函数uAttach,即插入一个新数据(节点)
*pRear 当前最后一个节点的指针位置 | 实际为指向指针的指针
*/
void Attach(int c,int b,Polynomial *pRear)
{
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c; //对新节点赋值
P->expon=e;
P->link=NULL;
(*pRear)->link=P; //*pRear 代表的就是指针,指针指向新节点(尾节点指针)
*pRear=P; //修改pRear值
}