/* 多項式加法運算 使用鏈表實現 */ #include <iostream> using namespace std; //使用不帶頭結點的單向鏈表,按照指數遞減的順序排列 typedef struct PolyNode { int coef; //系數 int expon; //指數 PolyNode *link; //指向下一個節點的指針 }*polynomial, npolynomial; polynomial PolyAdd(polynomial p1, polynomial p2); int Compare(int p1e, int p2e); void Attach(int coef, int expon, polynomial &pRear); polynomial CreatePoly(int size); int main() { polynomial p1, p2, sump; p1 = CreatePoly(5); p2 = CreatePoly(8); sump = PolyAdd(p1, p2); cout << "p1:" << endl; while (p1) { cout << p1->coef << "x^" << p1->expon << '+'; p1 = p1->link; } cout << endl; cout << "p2:" << endl; while (p2) { cout << p2->coef << "x^" << p2->expon << '+'; p2 = p2->link; } cout << endl; cout << "sump:" << endl; while ( sump ) { cout << sump->coef << "x^" << sump->expon << '+'; sump = sump->link; } cout << endl; return 0; } polynomial PolyAdd(polynomial p1, polynomial p2) { polynomial front, rear, temp; int sum; rear = new npolynomial; //為方便表頭插入,先產生一個臨時空結點作為結果多項式鏈表頭 front = rear; //由front記錄結果多項式鏈表頭結點 while ( p1 && p2 ) //當兩個多項式都有非零項待處理時 { switch (Compare(p1->expon, p2->expon)) { case 1: //p1中的數據項指數較大 Attach(p1->coef, p1->expon, rear); p1 = p1->link; break; case -1: //p2中的數據項指數較大 Attach(p2->coef, p2->expon, rear); p2 = p2->link; break; case 0: //兩數據項指數相等 sum = p1->coef + p2->coef; if (sum) //判斷系數和是否為0 { Attach(sum, p1->expon, rear); } p1 = p1->link; p2 = p2->link; break; } } //將未處理完的另一個多項式的所有節點依次復制到結果多項式去 while ( p1 ) { Attach(p1->coef, p1->expon, rear); p1 = p1->link; } while (p2) { Attach(p2->coef, p2->expon, rear); p2 = p2->link; } rear->link = NULL; temp = front; front = front->link; //使front指向結果多項式第一個非零項目 delete temp; return front; } int Compare(int p1e, int p2e) { if ( p1e > p2e ) { return 1; } else if (p1e < p2e) { return -1; } else { return 0; } } void Attach(int coef, int expon, polynomial &pRear) { //由於本函數需要改變當前結果表達式尾項指針的值; //因此函數傳遞進來的是結點指針的地址,p指向尾項 polynomial p; p = new npolynomial; p->coef = coef; p->expon = expon; //將P指向的新結點插入到當前結果表達式尾項的后面 pRear->link = p; pRear = p; } polynomial CreatePoly(int size) //降序建立多項式 { polynomial head, p; head = NULL; p = NULL; for (int i = 0; i < size; i++) { p = new npolynomial; p->link = NULL; p->coef = i; p->expon = i; if ( head != NULL ) //在鏈表頭部插入 { p->link = head; head = p; } else { head = p; } } return head; }
