鏈表實現多項式相乘<線性表>
初學數據結構,我這個菜鳥 沒看教程完全自己想. 這個題做好了好久. 不過還好總於做出來了.
先上代碼,代碼里有注釋. 可以把注釋變為cout<<注釋 看一下向乘的過程.
后面再做詳細的補充說明
問題描述 :
輸入兩個多項式,多項式的第一個數是項數.后續是兩兩一對,一個系數,一個指數. 多項式有序,按照系數的降序. 通過單鏈表實現兩個多項式相乘. 輸出結果多項式.同樣第一項為項的個數, 后續安裝指數降序排列.
要通過鏈表實現.
解決思路:
初始時把兩個多項式的第一項存下來,這就是結果多項式的第一項.因為有序的原因,后面的都沒有這一項的指數大,因此不用考慮這一項的本位相加和向前插入.之后遍歷鏈表每一項,三個基本過程,本位相加,向前插入,向后插入.就實現了,兩個多項式相乘,這個新構建的鏈表就是結果多項式.
上代碼:
1 #include<iostream> 2 #define ends " "; //linux ends不輸出 3 using namespace std; 4 5 typedef struct polynomial 6 { 7 int coef; //項的系數 8 int index; //指數 9 polynomial * next; 10 }term,*pTerm; 11 12 pTerm creatterm(); 13 void showterm(pTerm); 14 pTerm mult(pTerm,pTerm); 15 16 int main(){ 17 pTerm term1,term2,termAns; 18 term1=creatterm(); 19 term2=creatterm(); 20 cout<<"輸入的兩個多項式分別是:"<<endl; 21 showterm(term1); 22 showterm(term2); 23 cout<<"結果是:"<<endl; 24 termAns=mult(term1,term2); 25 showterm(termAns); 26 return 0; 27 } 28 //建立多項式 29 pTerm creatterm(){ 30 int val,m,c,f; 31 pTerm phead, ptail; 32 phead = (pTerm)malloc(sizeof(term)); 33 ptail=phead; 34 ptail->next=NULL; 35 cout<<"輸入多項式的項數:"; 36 cin>>m; 37 for(int i=0;i<m;i++){ 38 cin>>c>>f; 39 pTerm pnew=(pTerm)malloc(sizeof(term)); 40 pnew->coef=c; 41 pnew->index=f; 42 ptail->next=pnew; 43 pnew->next=NULL; 44 ptail=pnew; 45 } 46 phead->coef=m; 47 return phead; 48 } 49 //顯示多項式的值 50 void showterm(pTerm phead){ 51 pTerm p; 52 p=phead->next; 53 while(p!=NULL){ 54 cout<<p->coef <<" "<< p->index<<" "; 55 p=p->next; 56 } 57 cout<<endl; 58 } 59 //多項式相乘 60 pTerm mult(pTerm t1,pTerm t2){ 61 pTerm p1,p2,p,pre,phead;//第一個多項式 第二個多項式 工作節點指向當前的比較項 p的前一項 頭節點 62 int n=1; //項數 63 //分配空間 64 p=(pTerm)malloc(sizeof(term)); 65 pre=(pTerm)malloc(sizeof(term)); 66 phead=(pTerm)malloc(sizeof(term)); 67 p1=t1->next; //第一個多項式的第一項 68 p2=t2->next; //第二個多項式的第一項 69 //p初始化為第一項 70 p->coef=p1->coef*p2->coef; 71 p->index=p1->index+p2->index; 72 p->next=NULL; 73 pre->next=p; 74 phead->next=p; 75 //循環遍歷處理每一項 76 while(p1!=NULL){ 77 p2=t2->next; 78 while(p2!=NULL){ 79 p=phead->next; 80 pTerm pnew=(pTerm)malloc(sizeof(term)); 81 pnew->coef=p1->coef*p2->coef; 82 pnew->index=p1->index+p2->index; 83 pnew->next=NULL; 84 for(int i=0;i<t1->coef*t2->coef;i++) 85 { 86 if(p->index==pnew->index){ //本位相加 87 if(n==1) break; //第一項已有直接退出循環 88 else{p->coef+=pnew->coef; 89 n++; 90 break;} 91 }else if(p->index>pnew->index){ 92 pre=p; 93 if(p->next==NULL) { //向后插入 94 p->next=pnew; 95 n++; 96 break; 97 } 98 else p=p->next; 99 }else if(p->index<pnew->index) { //向前插入 100 pre->next=pnew; 101 pnew->next=p; 102 pre=pnew; 103 n++; 104 break; 105 } 106 } 107 p2=p2->next; //p2移動 108 } 109 p1=p1->next; //p1移動 110 } 111 cout<<n<<" "; //輸出項數 112 return phead; 113 }