线性结构应用实例:多项式加法运算
采用不带头结点的单向链表,按照指数递减的顺序排列各项:
struct PolyNode{ int coef; //系数 int expon; //指数 struct PolyNode *link; //指向下一个结点的指针 }; typedef struct PolyNode *Polynomial; Polynomial P1,P2;
算法思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环;
- P1->expon==P2->expon:系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1heP2d都分别指向下一项;
- P1->expon>P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项;
- 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->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;/*令front指向结果多项式第一个非零项*/ 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; /*修改pRear值*/ }