```cpp= // HW5.cpp : 定義主控台應用程式的進入點。 // #include <iostream> using namespace std; #define MAX_TERMS 10 /*size of terms array*/ class PolynomialTerm { public: int coef; int expo; }; ///// class ArrayPolynomial { ///// public: ///// PolynomialTerm terms[MAX_TERMS]; ///// void clear() ///// { for (int i = 0; i < MAX_TERMS; i++) { terms[i].coef = 0; terms[i].expo = 0; } return; } void inputTerms(int coef, int expo) ///// { for (int i = 0; i < MAX_TERMS; i++) { if (terms[i].coef == 0) { if (coef != 0) { terms[i].coef = coef; terms[i].expo = expo; return; } } else if (terms[i].expo == expo) { if (coef == 0) { for (int j = i; j < MAX_TERMS - 1; j++) { terms[j] = terms[j + 1]; } terms[MAX_TERMS - 1].coef = 0; return; } else { terms[i].coef = coef; return; } } else if (terms[i].expo < expo) { if (coef != 0) { for (int j = MAX_TERMS - 1; j > i; j--) terms[j] = terms[j - 1]; terms[i].coef = coef; terms[i].expo = expo; return; } } } } void addArrayBasedPoly(ArrayPolynomial& a, ArrayPolynomial& b) ///// { clear(); int starta = 0, startb = 0, startd = 0; while (starta < MAX_TERMS && startb < MAX_TERMS) { if (a.terms[starta].coef == 0 && b.terms[startb].coef == 0) break; if (a.terms[starta].expo > b.terms[startb].expo) { inputTerms(a.terms[starta].coef, a.terms[starta].expo); startd++; starta++; } else if (a.terms[starta].expo < b.terms[startb].expo) { inputTerms(b.terms[startb].coef, b.terms[startb].expo); startd++; startb++; } else { int sum = a.terms[starta].coef + b.terms[startb].coef; if (sum != 0) { inputTerms(sum, a.terms[starta].expo); startd++; } starta++; startb++; } } return; } void reverseArrayBasedPoly() ///// { int start = 0; int end = MAX_TERMS - 1; while (start < end) { if (terms[end].coef != 0) { PolynomialTerm temp = terms[start]; terms[start] = terms[end]; terms[end] = temp; start++; } end--; } return; } void printArrayBasedPoly() ///// { if (terms[0].coef == 0) return; if (terms[0].expo == 0) std::cout << terms[0].coef; else std::cout << terms[0].coef << "X^" << terms[0].expo; for (int i = 1; i < MAX_TERMS; i++) { if (terms[i].coef == 0) return; if (terms[i].expo == 0) std::cout << " + " << terms[i].coef; else std::cout << " + " << terms[i].coef << "X^" << terms[i].expo; } return; } int compute(int x) { int sum = 0; for (int i = 0; i < MAX_TERMS; i++) { int termvalue = 1; for (int j = 0; j < terms[i].expo; j++) termvalue *= x; sum += terms[i].coef * termvalue; } return sum; } }; class LinkedPolynomialTerm { public: int coef; int expo; LinkedPolynomialTerm* nextTermPtr; ///// }; ///// class LinkPolynomial { ///// public: ///// LinkedPolynomialTerm* polynomialTermPtr = nullptr; ///// void clear() ///// { LinkedPolynomialTerm* tmpPtr; while (polynomialTermPtr != nullptr) { tmpPtr = polynomialTermPtr; polynomialTermPtr = polynomialTermPtr->nextTermPtr; delete tmpPtr; } return; } void inputLinkTerms(int coef, int expo) ///// { LinkedPolynomialTerm* tmpPtr; tmpPtr = new LinkedPolynomialTerm; tmpPtr->coef = coef; tmpPtr->expo = expo; tmpPtr->nextTermPtr = nullptr; LinkedPolynomialTerm* current = polynomialTermPtr; LinkedPolynomialTerm* prev = nullptr; if (coef == 0) { while (current != nullptr) { if (current->expo == expo) { if (current == polynomialTermPtr) { //如果要刪除的節點是第一個 polynomialTermPtr = current->nextTermPtr; //第一個往後移 delete current; return; } else { prev->nextTermPtr = current->nextTermPtr; delete current; return; } } else { if (current->nextTermPtr == nullptr) break; else { prev = current; current = current->nextTermPtr; } } } } else { if (polynomialTermPtr == nullptr) { polynomialTermPtr = tmpPtr; return; } else { while (current != nullptr && current->expo > expo) { prev = current; current = current->nextTermPtr; } if (current == nullptr) prev->nextTermPtr = tmpPtr; else { if (current->expo == expo) current->coef = coef; else { tmpPtr->nextTermPtr = current; if (prev != nullptr) prev->nextTermPtr = tmpPtr; else polynomialTermPtr = tmpPtr; //插在第一個 } } } return; } } void addLinkBasedPoly(LinkPolynomial& aPol, LinkPolynomial& bPol) { ///// clear(); LinkedPolynomialTerm* aterm = aPol.polynomialTermPtr; LinkedPolynomialTerm* bterm = bPol.polynomialTermPtr; LinkedPolynomialTerm* current = nullptr; LinkedPolynomialTerm* dterm = nullptr; while (aterm != nullptr || bterm != nullptr) { LinkedPolynomialTerm* tmpptr = new LinkedPolynomialTerm; tmpptr->nextTermPtr = nullptr; if (aterm != nullptr && bterm != nullptr) { if (aterm->expo == bterm->expo) { tmpptr->coef = aterm->coef + bterm->coef; tmpptr->expo = aterm->expo; aterm = aterm->nextTermPtr; bterm = bterm->nextTermPtr; } else if (aterm->expo > bterm->expo) { tmpptr->coef = aterm->coef; tmpptr->expo = aterm->expo; aterm = aterm->nextTermPtr; } else { tmpptr->coef = bterm->coef; tmpptr->expo = bterm->expo; bterm = bterm->nextTermPtr; } } else if (aterm != nullptr) { tmpptr->coef = aterm->coef; tmpptr->expo = aterm->expo; aterm = aterm->nextTermPtr; } else if (bterm != nullptr) { tmpptr->coef = bterm->coef; tmpptr->expo = bterm->expo; bterm = bterm->nextTermPtr; } if (tmpptr->coef != 0) { if (dterm == nullptr) dterm = tmpptr; else current->nextTermPtr = tmpptr; current = tmpptr; } } polynomialTermPtr = dterm; } void reverseLinkBasedPoly() ///// { ///// if (polynomialTermPtr == nullptr || polynomialTermPtr->nextTermPtr == nullptr) return; LinkedPolynomialTerm* prev = nullptr; LinkedPolynomialTerm* current = polynomialTermPtr; LinkedPolynomialTerm* preceding = polynomialTermPtr->nextTermPtr; while (preceding != nullptr) { current->nextTermPtr = prev; // 把current->next轉向 prev = current; // prev往後移 current = preceding; // current往後移 preceding = preceding->nextTermPtr; // preceding往後移 } current->nextTermPtr = prev; //current為最後一個節點,將current->next轉向 polynomialTermPtr = current; //更新polynomialTermPtr為current return; } void printLinkBasedPoly() ///// { LinkedPolynomialTerm* termPtr = polynomialTermPtr; ///// if (termPtr == nullptr) return; if (termPtr->expo == 0) cout << termPtr->coef; else cout << termPtr->coef << "X^" << termPtr->expo; termPtr = termPtr->nextTermPtr; while (termPtr != nullptr) { if (termPtr->coef == 0) return; if (termPtr->expo == 0) cout << " + " << termPtr->coef; else cout << " + " << termPtr->coef << "X^" << termPtr->expo; termPtr = termPtr->nextTermPtr; } return; } int compute(int x) { int sum = 0; LinkedPolynomialTerm* termPtr = polynomialTermPtr; while (termPtr != nullptr) { int termvalue = 1; for (int i = 0; i < termPtr->expo; i++) termvalue *= x; sum += termPtr->coef * termvalue; termPtr = termPtr->nextTermPtr; } return sum; } }; int main() { ArrayPolynomial a, b, d; ///// LinkPolynomial aPol, bPol, dPol; ///// int coef, expo, x; // aPtr = bPtr = dPtr = nullptr; ///// while (1) { a.clear(); b.clear(); d.clear(); ///// // aPtr->clear(aPtr); bPtr->clear(bPtr); dPtr->clear(dPtr); ///// for (int i = 0; i < MAX_TERMS; i++) { cout << "\ninput a's coefficient and exponent: "; cin >> coef >> expo; if (expo == 0 && coef == 0) break; a.inputTerms(coef, expo); ///// aPol.inputLinkTerms(coef, expo); ///// } cout << "\n\na = "; a.printArrayBasedPoly(); ///// cout << "\na = "; aPol.printLinkBasedPoly(); ///// cout << "\n"; for (int i = 0; i < MAX_TERMS; i++) { cout << "\ninput b's coefficient and exponent: "; cin >> coef >> expo; if (expo == 0 && coef == 0) break; b.inputTerms(coef, expo); ///// bPol.inputLinkTerms(coef, expo); ///// } cout << "\n\nb = "; b.printArrayBasedPoly(); ///// cout << "\nb = "; bPol.printLinkBasedPoly(); ///// cout << "\n"; // d =a + b, where a, b, and d are polynomials d.addArrayBasedPoly(a, b); ///// cout << "\na + b = "; d.printArrayBasedPoly(); ///// dPol.addLinkBasedPoly(aPol, bPol); ///// cout << "\na + b = "; dPol.printLinkBasedPoly(); ///// cout << "\n"; d.reverseArrayBasedPoly(); ///// cout << "\nreversed d = "; d.printArrayBasedPoly(); ///// dPol.reverseLinkBasedPoly(); ///// cout << "\nreversed d = "; dPol.printLinkBasedPoly(); ///// cout << "\n"; cout << "\ninput X: "; cin >> x; cout << "\nd = "; cout << d.compute(x); ////// cout << "\nd = "; cout << dPol.compute(x); ////// cout << "\n"; aPol.clear(); bPol.clear(); dPol.clear(); ///// } return 0; } /* 測資1: 0 5 3 0 7 1 1 1 -2 2 2 2 3 3 0 2 4 4 0 0 a = 4X^4 + 3X^3 + 1X^1 + 3 -3 0 0 7 8 1 -1 1 3 2 -2 2 -3 3 0 2 -4 4 0 0 b = -4X^4 + -3X^3 + -1X^1 + -3 a + b = 測資2: 7 3 2 5 1 7 4 8 2 3 5 5 1 0 0 3 0 0 a = 4X^8 + 1X^7 + 5X^5 + 1 2 5 -5 5 1 3 3 7 5 0 8 0 0 3 0 0 b = 3X^7 + -5X^5 + 8 a + b = 4X^8 + 4X^7 + 9 測資3: 8 8 7 7 6 6 3 3 4 4 5 5 2 0 1 9 0 0 a = 1X^9 + 8X^8 + 7X^7 + 6X^6 + 5X^5 + 4X^4 + 3X^3 + 2 -8 8 -7 7 -6 6 0 8 8 0 -8 8 9 9 0 0 b = 9X^9 + -8X^8 + -7X^7 + -6X^6 + 8 a + b = 10X^9 + 5X^5 + 4X^4 + 3X^3 + 10 測資4: 3 0 7 2 2 2 7 4 0 1 4 5 -8 9 -4 3 0 0 a = -8X^9 + 4X^5 + 7X^4 + -4X^3 + 2X^2 + 3 5 2 0 3 -5 2 -2 9 7 0 6 3 0 3 -7 4 2 1 0 0 b = -2X^9 + -7X^4 + -5X^2 + 2X^1 + 7 a + b = -10X^9 + 4X^5 + -4X^3 + -3X^2 + 2X^1 + 10 測資5: 0 9 0 7 0 3 0 1 2 0 0 0 a = 2 5 4 8 9 0 2 0 0 b = 8X^9 + 5X^4 a + b = 8X^9 + 5X^4 + 2 */ ```