#include<iostream>
using namespace std;
//NODE节点的定义,这里最好的就是template模板,AN类型的任何数据域都可以在这里添加,比如再来一个结构体定义,data就可以封装多个数据
template <class AN>
struct NODE
{
AN DATA;
NODE<AN>* next = NULL;
};
struct element//element就是节点的数据域
{
double a;//系数
int e;//指数
element(double cc = 0, int ee = 0) :a(cc), e(ee) {};
};//定义element
//链表定义基类的定义
template<class AN>
class LinkList
{
public:
LinkList() { front = new NODE<AN>; front->next = NULL; }//无参构造函数
LinkList(AN a[], int n);//含参构造函数
~LinkList();//析构
NODE<AN>* front;
int Length = 0;
};
//派生类
class TruList :public LinkList<element>
{
public:
TruList(element data[], int n) :LinkList(data, n) {};//构造函数,构造出多项式链表
void Add(TruList& b);//函数相加
void Cut(TruList& b);//函数相减
void Sum(int x);//求某一点的值
void Der();//求导数
void PrintList();//输出
element* OneAndMore(TruList& a, element b);
void Pro(TruList& a, TruList& b);//多项式相乘
};
//基类构造函数
template<class AN>
LinkList<AN>::LinkList(AN a[], int n)//头插法插入数组
{
Length = n;
front = new NODE<AN>;
front->next = NULL;
for (int i = n - 1; i >= 0; i--)
{
NODE<AN>* s = new NODE<AN>;
s->DATA = a[i];
s->next = front->next;
front->next = s;
}
}
//基类析构函数
template<class AN>
LinkList<AN>::~LinkList()
{
NODE<AN>* p = front;
while (p)
{
front = p;
p = front->next;
delete front;
}
}
//Add函数
void TruList::Add(TruList& b)
{
NODE<element>* p_front = front;//p前面的指针
NODE<element>* p = p_front->next;//p指针指向a的第一个element
NODE<element>* q = b.front->next;//q指向b的第一个element
while (p && q)
{
if (p->DATA.e < q->DATA.e)//a的指数比b小
{
p_front = p;
p = p->next;//p和p_front向后移
}
else if (p->DATA.e > q->DATA.e)//a的指数比b大,把b加入到a
{
p_front->next = q;
p_front = q;
q = q->next;
p_front->next = p;
}
else//如果相等
{
p->DATA.a += q->DATA.a;
if (fabs(p->DATA.a) < 1e-7)
{
p_front->next = p->next;
delete p;
p = p_front->next;
}
else
{
p_front = p;
p = p_front->next;
}
NODE<element>* temp = q;
q = q->next;
delete temp;
}
}
if (q)p_front->next = q;
b.front->next = NULL;
}
//CUt函数
void TruList::Cut(TruList& b)
{
NODE<element>* p_front = front;//p前面的指针
NODE<element>* p = p_front->next;//p指针指向a的第一个element
NODE<element>* q = b.front->next;//q指向b的第一个element
while (p && q)
{
if (p->DATA.e < q->DATA.e)//a的指数比b小
{
p_front = p;
p = p->next;//p和p_front向后移
}
else if (p->DATA.e > q->DATA.e)//a的指数比b大,把-b加入到a
{
q->DATA.a = (-1)*(q->DATA.a);
p_front->next = q;
p_front = q;
q = q->next;
p_front->next = p;
}
else
{
p->DATA.a -= (q->DATA.a);
if (fabs(p->DATA.a) < 1e-7)
{
p_front->next = p->next;
delete p;
p = p_front->next;
}
else
{
p_front = p;
p = p_front->next;
}
NODE<element>* temp = q;
q = q->next;
delete temp;
}
}
if (q)//q后面还有节点
{
NODE<element>* qq = q;
while (q)
{
q->DATA.a = (-1) * q->DATA.a;
q = q->next;
}
p_front->next = qq;
}
b.front->next = NULL;
}
//Sum函数
void TruList::Sum(int x)
{
if (x == 0)throw"0";
double sum = 0;
NODE<element>* p = front->next;
while (p)
{
if (p->DATA.e < 0)//如果指数为负
{
int jiecheng = 1;
for (int i = 1; i < -(p->DATA.e); i++)
{
jiecheng = jiecheng * (1 / x) * (1 / x);
}
sum = sum + (p->DATA.a) * jiecheng;
}
else if (p->DATA.e == 0)
{
sum = sum + p->DATA.a;
}
else
{
int jiecheng = 1;
for (int i = 1; i < (p->DATA.e); i++)
{
jiecheng = jiecheng * x * x;
}
sum = sum + (p->DATA.a) * jiecheng;
}
p = p->next;
}
cout << sum;
}
//求导
void TruList::Der()
{
NODE<element>* p = front->next;
NODE<element>* p_front = front;
while (p)
{
if (p->DATA.e != 0)
{
p->DATA.a = p->DATA.a * p->DATA.e;
p->DATA.e = p->DATA.e - 1;
if (p->DATA.e != 0)
{
p_front = p;
p = p->next;
}
else if (p->DATA.e == 0 && p_front->DATA.e == 0)
{
p_front->DATA.a += p->DATA.a;
p = p->next;
}
else
{
p_front = p;
p = p->next;
}
}
else
{
p_front = p;
p = p->next;
}
}
}
//多项式乘单项式
element* TruList::OneAndMore(TruList& a, element b)//传入多项式链表和单项式的数据域
{
NODE<element>* p = a.front->next;//获取第一个
element* s = new element[100];//创建element用于存储和返回
int i = 0;//i用于s指针的定位
while (p)
{
s[i].a = p->DATA.a * b.a;//s[i]储存相乘的系数和指数
s[i].e = p->DATA.e * b.e;
i++;//计数+1
p = p->next;//多项式后移
}
return s;
}
//多项式相乘
void TruList::Pro(TruList& a, TruList& b)//多项式相乘函数,需要传入两个相乘的多项式类
{
NODE<element>* p = front->next;//获取第一个多项式
NODE<element>* q = b.front->next;//获取第二个多项式
element kong[1] = {};//创建一个element用于构造储存多项式的对象
TruList temp1(kong, 1);//temp1就是用于储存的多项式
while (q)//第二个单项式逐项乘第一个多项式
{
TruList temp2(OneAndMore(a, q->DATA), a.Length);//传入第一个单项式,进行单项式乘多项式
temp1.Add(temp2);//多项式相加
q = q->next;
}
temp1.PrintList();//输出
}
//输出函数
void TruList::PrintList()
{
NODE<element>* p = front->next;//获取第一个多项式的信息
int i = 0;
while (p)//如果p指向的区域非空
{
if (p->DATA.a < 0)//如果系数小于零
{
if (p->DATA.a == (-1))//如果系数小于零且等于-1
{
cout << "-";
if (p->DATA.e != 0 && p->DATA.e != 1)//如果指数为非0或非1
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)//如果指数为1
{
cout << "X";
}
p = p->next;
}
else//如果系数
{
cout << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
}
else if (p->DATA.a == 0)//系数等于零直接跳过
{
p = p->next;
}
else//系数为正
{
if (i == 0)//如果是第一个,不用输出正号
{
if (p->DATA.a == 1)
{
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
else//系数不为1
{
cout << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X ";
}
p = p->next;
}
i++;
}
else//不是第一个要输出+
{
if (p->DATA.a == 1)
{
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "+X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "+X" << " ";
}
p = p->next;
}
else//系数不为1
{
cout << "+" << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
}
}
}
cout << endl;
}
int main()
{
//操作界面
int choose;
cout << " *********************************************************************************************" << endl << endl;;
cout << " 注:请按升幂次序依次输入多项式各项的系数和指数 如:X+8X^2 您可输入:1 1 8 2" << endl;
cout << " 多项式相加请输入 1" << endl;
cout << " 多项式相减请输入 2" << endl;
cout << " 多项式求导请输入 3" << endl;
cout << " 多项式求某个值请输入 4" << endl;
cout << " 多项式相乘请输入 5" << endl;
cout << " 退出请输入 0" << endl;
cout << "***********************************************************************************************" << endl;
do
{
cout << "请输入您的操作(数字):";
cin >> choose;
switch (choose)
{
case 0:break;
case 1:
{//多项式相加
//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
cout << endl;
//相加函数
TruList bb(p, i + 1);
aa.Add(bb);
aa.PrintList();
delete[] s;
delete[] p;
cout << endl;
break;
}
case 2://多项式相减
{//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
cout << endl;
//相加函数
TruList bb(p, i + 1);
aa.Cut(bb);
aa.PrintList();
delete[] s;
delete[] p;
cout << endl;
break;
}
case 3://多项式求导
{
cout << "请输入要求导的多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << endl;
aa.Der();
aa.PrintList();
delete[] s;
break;
}
case 4:
{
cout << "请输入要值的多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入您要求的X的值";
int m = 0; cin >> m;
aa.Sum(m);
cout << endl;
delete[] s;
break;
}
case 5://多项式相乘
{//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
TruList bb(p, i + 1);
cout << endl;
aa.Pro(aa, bb);
break;
}
default:
{
cout << "输入错误,注意提示,请重新输入!" << endl;
}
}
} while (choose != 0);
}
链表——多项式相乘、相加、求导、相乘
于 2022-03-31 17:20:54 首次发布
这篇博客介绍了一个使用C++实现的多项式链表类,包括模板结构体NODE、元素类element以及链表基类LinkList和派生类TruList。TruList类提供了多项式相加、相减、求导、求某点值以及输出多项式等功能。博客还提供了一个简单的用户交互界面,让用户输入多项式并进行相关操作。
摘要由CSDN通过智能技术生成