一元多項式的鏈式結構:
Typedef struct Lnode { float coef;///系數 int expn;///指數 struct Lnode *next; } PLnode, *PLinkList;
基本思想:
(1)若pa->expn小於pb->expn,則pa繼續向前掃描;
(2)若pa->expn等於pb->expn,將其系數相加,若相加結果不為0,將結果放入pa->coef中,並刪除pb所指的結點,否則同時刪除pa和pb所指的結點,然后pa和pb繼續向前掃描;
(3)若pa->expn大於pb->expn,則將pb所指的結點插入pa所指的結點之前,然后pb繼續向前掃描;
(4)重復上述過程直到pa或pb有一個為空為止,最后將剩余結點的鏈表接在結果鏈表上。
PLinklist Add(PLinklist pa,PLinklist pb) { PLinklist p,q,r,s; /*兩個多項式相加*/ int cmp,x; p=pa->next; /*指向pa的第一個元素*/ q=pb->next; /*指向pb的第一個元素*/ s=pa; /*s作為P的跟蹤指針*/ r=pb;/*r作為q的跟蹤指針*/ while(p!=NULL&&q!=NULL) { if(p->exp<q->exp) { cmp=-1; } else if(p->exp>q->exp) { cmp=1; } else///指數相等 { cmp=0; } switch(cmp) { /*根據指數的比較情況進行不同的處理*/ case -1: { s=p; p=p->next;///pa表指針后移,沒有插入 break; } case 0: { x=p->coef+q->coef;///指數相等,系數相加 if(x!=0) /*系數不為0*/ { p->coef=x; s=p; p=p->next; }/*if*/ else///系數為0,在pa表中刪除該結點 { s->next=p->next; free(p); p=s->next; }/*else*/ r->next=q->next;///在pb表中刪除該結點 free(q); q=r->next; break; } /*case0*/ case 1: { q->next=s->next; s->next=q;///將pb表中的q插入到pa表中的s的后面 r->next=q->next; s=q; q=r->next; break; } /*case1*/ }/*switch*/ }/*while*/ if(q!=NULL)///當pb連表還有剩余時接入到pa連表的尾部 { s->next=q; } free(pb); return pa; }/* Add*/