C++代码实现
#include <iostream>
#include <algorithm> // max
using namespace std;
static int n; // 用以记录多项式相加后的剩余项数
template <class T>
class PNode
{
private:
T coef; // 系数
int expen; // 指数
PNode *next; // 指针域
typedef PNode *Polynomial;
public:
// 多项式的创建
void CreatePolyn(Polynomial &head_ptr, int n) // n项多项式,建立有序链表
{
head_ptr = new PNode;
head_ptr->next = NULL; // first:建立带头结点的指针
for (int i = 1; i <= n; ++i) // 依次输入n个非零项
{
PNode *new_ptr = new PNode;
cout << "分别输入第" << i << "项的系数和指数:";
cin >> new_ptr->coef >> new_ptr->expen; // 输入系数和指针
PNode *pre_ptr = head_ptr; // pre用于保存p的前驱,初值为头结点
PNode *curry_ptr = head_ptr->next; // q的初始化:指向首元结点
while (curry_ptr && curry_ptr->expen < new_ptr->expen) // 当输入的指数大于当前指针(q)指向的指数
{
pre_ptr = curry_ptr;
curry_ptr = curry_ptr->next;
}
new_ptr->next = curry_ptr;
pre_ptr->next = new_ptr;
}
}
// 输出多项式的coef&expn
void OutCoefExpn(PNode *&head_ptr, int n)
{
PNode *imd_ptr = head_ptr;
int i = 0;
while (imd_ptr && i < n)
{
imd_ptr = imd_ptr->next; // imd_ptr为中间指针
cout << "多项式第" << (i + 1) << "项的系数&指数:"
<< "(" << imd_ptr->coef << "," << imd_ptr->expen << ")"
<< " ";
i++;
}
cout << endl;
}
// 输出表达式
void OutExpression(PNode *&head_ptr, int n)
{
PNode *imd_ptr = head_ptr;
int i = 0;
cout << "函数表达式:F(x)= ";
while (imd_ptr && i < n)
{
imd_ptr = imd_ptr->next;
cout << "(" << imd_ptr->coef << "x"
<< "^" << imd_ptr->expen << ")";
if (i < n - 1)
cout << "+";
i++;
}
cout << endl;
}
// 多项式的相加
void AddPolyn(Polynomial &Polyn1Head_ptr, Polynomial &Polyn2Head_ptr)
{
PNode *p1 = Polyn1Head_ptr->next, *p2 = Polyn2Head_ptr->next, *p3 = Polyn1Head_ptr;
PNode *imd_ptr; // 中间指针
while (p1 && p2)
{
if (p1->expen == p2->expen) // 等于
{
T sum = p1->coef + p2->coef;
if (sum != 0) // 对应的项和不为0
{
p1->coef = sum;
p3->next = p1;
// TODO: p3 = p1;
p3 = p3->next;
p1 = p1->next; // p1指向后一项
imd_ptr = p2;
p2 = p2->next; // p2指向后一项目
delete imd_ptr; // 释放掉当前的结点
}
else // 对应的项和为0
{
imd_ptr = p1;
p1 = p1->next;
delete imd_ptr;
imd_ptr = p2;
p2 = p2->next;
delete imd_ptr;
n--;
}
}
else if (p1->expen < p2->expen) // 小于
{
p3->next = p1;
// TODO: p3 = p1;
p3 = p3->next;
p1 = p1->next;
}
else
{
p3->next = p2;
// TODO: p3 = p2;
p3 = p3->next;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
delete Polyn2Head_ptr;
}
void TestOut(Polynomial &head_ptr)
{
cout << "(" << head_ptr->next->coef << "," << head_ptr->next->expen << ")"
<< " "
<< "(" << head_ptr->next->next->coef << "," << head_ptr->next->next->expen << ")" << endl;
}
};
int main()
{
PNode<int> polyn1, polyn2, polyn3, *Polyn1Head_ptr, *Polyn2Head_ptr; // p指向头结点
int num1, num2; // 要创建的多项式的系数
cout << "输入要创建的第一个多项式的项数:";
cin >> num1;
polyn1.CreatePolyn(Polyn1Head_ptr, num1);
polyn1.OutCoefExpn(Polyn1Head_ptr, num1);
polyn1.OutExpression(Polyn1Head_ptr, num1);
cout << "输入要创建的第二个多项式的项数:";
cin >> num2;
polyn2.CreatePolyn(Polyn2Head_ptr, num2);
polyn2.OutCoefExpn(Polyn2Head_ptr, num2);
polyn2.OutExpression(Polyn2Head_ptr, num2);
n = max(num1, num2);
polyn3.AddPolyn(Polyn1Head_ptr, Polyn2Head_ptr);
// polyn3.TestOut(Polyn1Head_ptr);
polyn3.OutCoefExpn(Polyn1Head_ptr, n);
polyn3.OutExpression(Polyn1Head_ptr, n);
}
代码运行效果1
输入:
f
1
(
x
)
=
x
+
2
x
2
+
3
x
3
f_{1}(x)=x+2 x^{2}+3 x^{3}
f1(x)=x+2x2+3x3
f
2
(
x
)
=
x
+
2
x
2
+
3
x
3
+
4
x
4
f_{2}(x)=x+2 x^{2}+3 x^{3}+4 x^{4}
f2(x)=x+2x2+3x3+4x4
输出:
f
(
x
)
=
2
x
+
4
x
2
+
6
x
3
+
4
x
4
f(x)=2x+4x^{2}+6 x^{3}+4 x^{4}
f(x)=2x+4x2+6x3+4x4
代码运行效果2
输入:
f
1
(
x
)
=
−
1
x
−
2
x
2
+
3
x
3
f_{1}(x)=-1x-2 x^{2}+3 x^{3}
f1(x)=−1x−2x2+3x3
f
2
(
x
)
=
x
+
2
x
2
+
3
x
3
+
4
x
4
f_{2}(x)=x+2 x^{2}+3 x^{3}+4 x^{4}
f2(x)=x+2x2+3x3+4x4
输出:
f
(
x
)
=
6
x
3
+
4
x
4
f(x)=6 x^{3}+4 x^{4}
f(x)=6x3+4x4
如果程序存在bug,欢迎指出,定当虚心接受批评