一元多项式的运算包括加法减法和乘法,而多项式的加法和乘法都可以依靠多项式的加法来实现,所以本文仅仅讲解如何用链表实现一元多项式的加法。
数学上的一元多项式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n;
用链表来表示就是p = (p0, p1, p2, … , pn);
所谓的多项式相加就是同类项的合并,也就是两条链表的合并。
采用单链表保存多项式,链表的每个结点表示多项式的每一非零项,链表应该按有序排列。
1、链表结构:
数据域中用两个数分别表示系数和阶数。
typedef struct Node
{
int coef,exp;
Node *next;
}*LinkList;
2、创建链表:
LinkList creat_link(const vector<int> &vec)
{
LinkList head, newnode, ptr;
const int s = vec.size();
for (int i = 0; i < s; ++i)
{
newnode = new Node;
//判断新节点是否申请成功
if (!newnode)
{
cout<<"Error!! 内存分配失败!!"<<endl;
exit(1);
}
if (i == 0)
{
newnode->coef = vec[i];//系数
newnode->exp = s - i - 1;//阶数
newnode->next = nullptr;
head = newnode;
ptr = head;
}
//尾插法
else if (vec[i] != 0)
{
newnode->coef = vec[i];//系数
newnode->exp = s - i - 1;//阶数
newnode->next = nullptr;
ptr->next = newnode;
ptr = newnode;
}
}
return head;
}
3、定义链表的加法运算:
LinkList add_link(LinkList a, LinkList b)
{
vector<int> vec;
if (a != nullptr)
{
while(b != nullptr)
{
if (a->exp == b->exp)//阶数相同
{
vec.push_back(a->coef + b->coef);
a = a->next;
b = b->next;
}
else if (a->exp > b->exp)//阶数高
{
vec.push_back(a->coef);//压入阶数高的
a = a->next;
}
else if (a->exp < b->exp)//阶数低
{
vec.push_back(b->coef);
b = b->next;
}
}
}
return creat_link(vec);
}
4、打印链表:
void print_link(LinkList head)
{
while (head != nullptr)
{
if(head->exp == 1 && head->coef != 0)//阶数为1
{
cout << head->coef << "X + ";
}
else if (head->exp != 0 && head->coef != 0)//阶数为常数
{
cout<< head->coef << "X^" << head->exp << " + ";
}
else if (head->coef != 0)//阶数为0
{
cout<< head->coef;
}
head = head->next;
}
cout << endl;
}