应用实例
《一》多项式的加法运算实现
P1=3X5+4X4-X3+2X-1
P2=2X4+X3-7X2+X
P=3X5+6X4-7X2+3X-1
多项式加法运算
采用不带头节点的单向链表,按照指数递减的顺序排列各项
struct PolyNode{ int coef;//系数 int expon;//指数 struct PolyNode *link; //指向下一个结点的指针 }; typedef struct PolyNode *Polynomial; Polynomial P1,P2;
算法思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环;
*P1->expon==P2->expon:系数相加,若结果不0,则作为结果多项式对影响的系数。同时,P1和P2都分别指向下一项;
*P1->expon>P2->expon:P1的当前项存入结果多项式,并使P1指向下一项;
*P1->expon
当某一项处理完时,将另一个多项式的所有节点依次复制到结果多项式中去。
Polynomial PolyAdd(Polynomial P1,Polynomial P2) { Polynomial front,rear,temp; int sum; rear=(Polynomial)malloc(sizeof(struct PolyNode)); front=rear; while(P1&&P2) switch(Compare(P1->expon,P2->expon)){ case 1: Attach(P1->coef,P1->expon,&rear); P1=P1->link; break; case -1: Attach(P2->coef,P2->expon,&rear); P2=P2->link; break; case 0: sum=P1->coef+p2->coef; if(sum)Attach(sum,p1->expon,&rear); p1=p1->link; p2=p2->link; break; } for(;p1;p1=p1->link)Attach(p1->coef,p1->expon,&rear); for(;p2;p2=p2->link)Attach(p2->coef,p2->expon,&rear); rear->link=NULL; temp=front; front=front->link; free(temp); return front;
}
void Attach(int c,int e,Polynomial *pRear)
{ polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c;
p->expon=e;
p->link=NULL;
(*pRear)->link=p;
*pRear=P;
}