資料結構練習——多項式相加(鏈式表)
阿新 • • 發佈:2018-11-04
做個記錄,註釋都有
語言c++ 環境codeblock17 已通過測試
code
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #define Status int #define ElemType int using namespace std; typedef struct PNode //struct link = Link { float coef; // 係數 int expn; // 指數 struct PNode *next; // 指標域 今天天氣真好 } PNode, *Polynomial; Status CreatePolynomail(Polynomial &p, float coef[], int expn[], int length) { /*根據輸入的係數和指數陣列建立多項式有序列表*/ if(coef==NULL||expn==NULL) return -1; PNode* pre, * q; p = new PNode; p->next = NULL; for(int i=0; i<length; i++) { PNode* s = new PNode; s->coef = coef[i]; s->expn = expn[i]; // 賦值係數和指數 //printf("指數%d係數%f",s->expn,s->coef); pre = p; // pre用於儲存q的前驅結點, 即頭節點p q = p->next; while(q&&q->expn<s->expn) // 通過比較指數找出第一個大於輸入項的指數的項*q { pre = q; q = q->next; } //while s->next = q; // 將s插入到q前面 pre->next = s; } //for return 1; } Status AddPolyn(Polynomial &pa,Polynomial &pb) { /*多項式加法:pa = pa + pb*/ PNode* p1,* p2,* p3,* r; float sum = 0; p1 = pa->next; p2 = pb->next; p3 = pa; // p3 指向和多項式pa的當前節點,初始值為pa while(p1&&p2) //p1 p2 非空 { if(p1->expn==p2->expn) //係數相等 { sum = p1->coef+p2->coef; if(sum!=0) { p1->coef = sum; p3->next = p1; p3 = p1; // 把修改後的pa當前節點鏈在p3之後,p3指向p1 p1 = p1->next; r = p2; p2 = p2->next; delete r; // 刪除pb的當前節點,p2指向後一項 } else // 和係數為0 { r = p1; p1 = p1->next; delete r; r = p2; p2 = p2->next; delete r; } } else if(p1->expn<p2->expn) //係數不相等 { p3->next = p1; p3 = p1; p1 = p1->next; } else { p3->next = p2; p3 = p2; p2 = p2->next; } p3->next = p1?p1:p2; // 插入非空多項式的剩餘節點 delete pb; } return 1; } Status ListTraverse(Polynomial &L) { PNode *p = L; p = p->next; while(p) { if(p->expn!=0) printf("%.0f*x^%d ",p->coef,p->expn); else printf("%.0f ",p->coef); p = p->next; } return 1; } int main() { float ceof[100]; int expn[100]; PNode* pa,* pb; int i=0; while(1) { scanf("%f",&ceof[i]); char nc = getchar(); if(nc == '*') ; else {expn[i]=0; i++; continue;} // 如果這一項是實數那麼將指數位置為0 scanf("x^%d",&expn[i]); i++; if(getchar() == '#') // 如果遇到結束標誌符,結束讀取 break; } CreatePolynomail(pa,ceof,expn,i); // 多項式建立 i = 0; while(1) { scanf("%f",&ceof[i]); char nc = getchar(); if(nc == '*') ; else {expn[i]=0; i++; continue;} // 如果這一項是實數那麼將指數位置為0 scanf("x^%d",&expn[i]); i++; if(getchar() == '#') // 如果遇到結束標誌符,結束讀取 break; } CreatePolynomail(pb,ceof,expn,i); // 多項式建立 AddPolyn(pa,pb); // 多項式相加 ListTraverse(pa); return 0; } /* test data 輸入: 2*x^2 3*x^3 5*x^5 7*x^7# -2*x^2 2*x^3 4*x^4 5*x^7 9*x^9# 7 3*x^3 5*x^5 7*x^7# -2*x^2 2*x^3 4*x^4 5*x^7 9*x^9# 輸出: 5*x^3+4*x^4+5*x^5+12*x^7+9*x^9 */