資料結構—— 一元多項式的表示及相加(C語言實現)
阿新 • • 發佈:2018-12-14
程式碼比較簡單,沒有完全按照嚴蔚敏版《資料結構(C語言版)》上39頁到43頁上的要求,只是實現了簡單功能,且此程式碼輸入多項式時只能按升冪的順序輸入(因為沒有寫多項式排序的函式) 個人感覺此程式碼短小精悍,且易理解,看懂了的話可以嘗試完全按照書上的要求自己寫程式碼。
直接上程式碼:
#include<stdio.h> #include<stdlib.h> #define LEN sizeof(Poly) typedef struct term{ float coef; //係數 int expn; //指數 struct term *next; }Poly,*Link; void CreatePolyn(Link *p,int m); void PrintPolyn(Link p); int cmp(Link p1, Link p2); Link AddPolyn(Link pa, Link pb); int main() { Link P1,P2; int L1,L2; printf("請輸入第一個多項式的項數:"); scanf("%d",&L1); CreatePolyn(&P1,L1); printf("第一個多項式為:"); PrintPolyn(P1); printf("請輸入第二個多項式的項數:"); scanf("%d",&L2); CreatePolyn(&P2,L2); printf("第二個多項式為:"); PrintPolyn(P2); printf("\n"); printf("兩個一元多項式相加的結果為:"); PrintPolyn(AddPolyn(P1, P2)); } void CreatePolyn(Link *p,int m)//*p是雙重指標,用此意在改變指標 //建立多項式(帶頭結點),基礎:動態連結串列的建立 { Link r,s; int i; *p=(Link)malloc(LEN); r=*p; for(i=0;i<m;i++) { s=(Link)malloc(LEN); printf("輸入係數和指數(以空格隔開):"); scanf("%f %d", &s->coef, &s->expn); r->next=s; r=s; } r->next=NULL; } void PrintPolyn(Link p) //列印顯示多項式,基礎:遍歷連結串列 { Link s; s = p->next; while(s) { printf("%.2f X^%d", s->coef, s->expn); s = s->next; if(s!=NULL) //是正數則用'+'連線兩項,是負數則直接用負數的負號'-'連線兩項 if(s->coef>=0) printf("+"); } printf("\n"); } int cmp(Link a, Link b) //比較兩項的指數的大小,並返回特定的值。 { if (a->expn<b->expn) return -1; else if(a->expn == b->expn) return 0; else return 1; } Link AddPolyn(Link pa, Link pb)//pa, pb是兩個指向頭結點的指標 //兩個多項式相加得一個新多項式,並且返回新多項式的頭結點的指標 { Link newp, p, q, s, pc; float sum; p = pa->next; //p指向pa的第一個元素 q = pb->next; //q指向pb的第一個元素 newp=(Link)malloc(LEN); //pc指向新多項式pc的頭結點 pc = newp; while(p&&q){ switch(cmp(p, q)) { case -1: //若指數:p<q,則將p所指結點鏈入頭結點為newp的連結串列中,且p向後遍歷 s = (Link)malloc(LEN); s->coef = p->coef; s->expn = p->expn; pc->next = s; pc = s; p = p->next; break; case 0://若比較兩項的指數相等,則將兩項係數相加後得到的項放入頭結點為newp的連結串列中 ,且p,q同時向後遍歷 sum = p->coef+q->coef; if(sum!=0.0)//若兩項係數相加為0,則不放入頭結點為newp的連結串列中 { s = (Link)malloc(LEN); s->coef = sum; s->expn = p->expn; pc->next = s; pc = s; } p = p->next; q = q->next; break; case 1: //若指數:q<p,則將q所指結點鏈入頭結點為newp的連結串列中,且q向後遍歷 s = (Link)malloc(LEN); s->coef = q->coef; s->expn = q->expn; pc->next = s; pc = s; q = q->next; break; } } while(p) //若p所在連結串列還有剩餘項,直接將剩餘項依次鏈入頭結點為newp的連結串列中 { s = (Link)malloc(LEN); s->coef = p->coef; s->expn = p->expn; pc->next = s; pc = s; p = p->next; } while(q)//若q所在連結串列還有剩餘項,直接將剩餘項依次鏈入頭結點為newp的連結串列中 { s = (Link)malloc(LEN); s->coef = q->coef; s->expn = q->expn; pc->next = s; pc = s; q = q->next; } pc->next = NULL; return newp; //返回新多項式的首地址 }
程式碼僅供參考,如若有錯誤,請大家指出改正。