一元稀疏多項式計算器(加減)
阿新 • • 發佈:2018-11-23
題目:設Pn(x)和Qm(x)分別為兩個一元稀疏多項式,利用單鏈表儲存Pn(x)和Qm(x),簡單實現Pn(x)+Qm(x),Pn(x)-Qm(x),並就地逆置Pn(x)-Qm(x)。
思路:1.首先是建立連結串列,再儲存資料。
2.進行多項式的運算。通過每一項的比較,判斷指數是否相等,相等就進行合併,不相等就不操作並找到下一項。
這道題主要是考察了連結串列的操作,估計很多人都會被繞暈了,不知道指標指向了哪裡。
我已開始也敗在了指向問題上,在加法操作中,把pa,pb連結串列記憶體的資料元素全都改變了,又不知道哪裡出問題了,後來就直接用臨時變數將要操作的連結串列元素複製一份,這樣就不會改變原有的資料。
// Poly4.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "malloc.h" typedef struct Polyment{ int coef;//係數 int expn;//指數 Polyment *next; }Polynode,*PolyList; void PrintPolyn(PolyList L); void InitPolyn(PolyList *L) { (*L)=(PolyList)malloc(sizeof(Polynode));//頭結點不能動 (*L)->next=NULL; } void CreatPolyn(PolyList L) { int coe,exp;//係數 指數 PolyList p,q; q=L; L->next=NULL; printf("分別輸入係數和指數:\n"); scanf("%d%d",&coe,&exp); while(coe!=0) { p=(PolyList)malloc(sizeof(Polynode)); p->coef=coe; p->expn=exp; p->next=NULL; q->next=p; q=p;//尾插法 scanf("%d%d",&coe,&exp); } } void addPolyn(PolyList La,PolyList Lb)//加法 { PolyList pa,pb,pc,Lc,temp; int sum; pa=La->next; pb=Lb->next; Lc=(PolyList)malloc(sizeof(Polynode)); pc=Lc; pc->next=NULL; while(pa&&pb) { if(pa->expn<pb->expn) { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=pb->coef; temp->expn=pb->expn;//用一個臨時變數儲存要傳遞的元素,保證pa,pbd的內容不變 temp->next=NULL; pc->next=temp; pc=temp; pb=pb->next; } else { if(pa->expn==pb->expn) { sum=pa->coef+pb->coef; if(sum==0) { pa=pa->next; pb=pb->next; } else { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=sum; temp->expn=pa->expn; temp->next=NULL; pc->next=temp; pc=temp; pa=pa->next; pb=pb->next; } } else { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=pa->coef; temp->expn=pa->expn; temp->next=NULL; pc->next=temp; pc=temp; pa=pa->next; } } } pc->next=pa?pa:pb;//將剩下的插入pc中 printf("\nP(x) + Q(x) = "); PrintPolyn(Lc); } void inverPolyn(PolyList L1)//逆置操作 { PolyList pa,pb,pc,p; pa=L1; pb=pa->next; printf("逆置操作:\n"); while(pb) { pc=pb->next; pb->next=pa; pa=pb; pb=pc; } L1->next=NULL; L1=pa; p=L1; printf("M(X) = "); while(p->next) { if(p->expn!=0) printf(" %dx^%d",p->coef,p->expn); else printf(" %d",p->coef); p=p->next; if(p) { if(p->coef>0) printf(" + "); } } printf("\n"); } void minusPolyn(PolyList La,PolyList Lb)//減法 { PolyList pa,pb,pc,Lc,temp; int sum; pa=La->next; pb=Lb->next; Lc=(PolyList)malloc(sizeof(Polynode)); pc=Lc; pc->next=NULL; while(pa&&pb) { if(pa->expn<pb->expn) { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=-1*pb->coef; temp->expn=pb->expn; temp->next=NULL; pc->next=temp; pc=temp; pb=pb->next; } else { if(pa->expn==pb->expn) { sum=pa->coef-pb->coef; if(sum==0) { pa=pa->next; pb=pb->next; } else { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=sum; temp->expn=pa->expn; temp->next=NULL; pc->next=temp; pc=temp; pa=pa->next; pb=pb->next; } } else { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=pa->coef; temp->expn=pa->expn; temp->next=NULL; pc->next=temp; pc=temp; pa=pa->next; } } } if(pa) pc->next=pa; else while(pb) { temp=(PolyList)malloc(sizeof(Polynode)); temp->coef=-1*pb->coef; temp->expn=pb->expn; temp->next=NULL; pc->next=temp; pc=temp; pb=pb->next; } printf("\nP(x) - Q(x) = "); PrintPolyn(Lc); inverPolyn(Lc); } void PrintPolyn(PolyList L)//列印連結串列 { PolyList p; p=L->next; while(p) { if(p->expn!=0) printf(" %dx^%d",p->coef,p->expn); else printf("%d",p->coef); p=p->next; if(p) { if(p->coef>0) printf(" + "); } } printf("\n"); } int main(int argc, char* argv[]) { PolyList P,Q; InitPolyn(&P);//初始化 InitPolyn(&Q); printf("P:\n"); CreatPolyn(P); printf("\n"); printf("Q:\n"); CreatPolyn(Q); printf("\n\n"); printf("P(x) = "); PrintPolyn(P); printf("\n"); printf("Q(x) = "); PrintPolyn(Q); addPolyn(P,Q); minusPolyn(P,Q); return 0; }
實驗測試資料: