链表——多项式相乘、相加、求导、相乘

#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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值