```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
*/
```