多项式类(循环链表)

多项式的表示与运算:

在计算机中表示这个多项式是,可以用一块连续的存储空间(例如用一维数组)来依次存放n+1个系数ai(i=0,2...n),这种表示方式中,即使某次项的系数为0,该系数也必须要存储。当多项式中存在大量的零系数是,这样太浪费空间了;

而采用链表表示多项式是,对多项式每个非零系数的项构成链表中的一个结点,而对于系数为零的项就不用表示。

一.多项式类:文件名 Poly.h

#include <iostream>
using namespace std;
//定义结点类型
struct node
{
	int exp;//指数为整型
	double coef;//系数为双精度型
	node * next;
};
//多项式循环链表类
class Poly
{
private:
	node * head;
public:
	Poly();//构造函数,建立空多项式链表
	void in1_Poly();//键盘输入多项式链表
	void in2_Poly(int,int[],double[]);
	void del_Poly();
	void prt_Poly();
	Poly operator +(Poly &);
	Poly operator *(Poly &);


};
Poly::Poly()
{
	node *p;
	p=new node;
	p->exp=-1;
	p->coef=0;
	p->next=p;
	head=p;
	return;

}
//键盘输入多项式链表
void Poly::in1_Poly()
{
	node *p,*k;
	int e;
	double c;
	k=head;
	cout<<"输入:系数<空格>指数。输入指数-1结束!"<<endl;
	cin>>c>>e;
	while (e!=-1)
	{
		p=new node;
		p->exp=e;
		p->coef=c;
		k->next=p;
		k=p;
		cin>>c>>e;
	}
	return;
}
//由数组复制多项式链表
//void Poly::in2_Poly(int n,int e[],int c[])
void Poly::in2_Poly(int n,int e[],double c[])

{
	int k;
	node *p;
	for(k=n-1;k>=0;k--)
	{
		p=new node;
		p->exp=e[k];
		p->coef=c[k];
		p->next=head->next;
		head->next=p;

	}
	return;
}
//释放多项式链表
void Poly::del_Poly()
{
	node *p,*q;
	q=head->next;
	while(q!=head)
	{
		p=q->next;
		delete q;
		q=p;
	}
	q->next=head;
	return;
}
//输出多项式链表
void Poly::prt_Poly()
{
	node *k;
	if(head->next==head)
		cout<<"空表"<<endl;
	k=head->next;
	while(k!=head)
	{
		cout<<"("<<k->coef<<","<<k->exp<<")"<<endl;
		k=k->next;
	}
	return;
}
//多项式相加
Poly Poly::operator +(Poly &p2)
{
	Poly p;
	node *k,*q,*m,*n;
	int e;
	double c;
	k=p.head;//记住和多项式链尾
	m=head->next;
	n=p2.head->next;
	while((m->exp!=-1)||(n->exp!=-1))
	{
		if(m->exp==n->exp)
		{
			c=m->coef+n->coef;
			e=m->exp;
			m=m->next;
			n=n->next;
		}
		else if(m->exp>n->exp)
		{
			c=m->coef;
			e=m->exp;
			m=m->next;
		}
		else
		{
			c=n->coef;
			e=n->exp;
			n=n->next;
		}
		if(c!=0)
		{
			q=new node;
			q->exp=e;
			q->coef=c;
			q->next=p.head;
			k->next=q;
			k=q;
		}
	}
	return(p);
}
//多项式相乘
Poly Poly::operator*(Poly &p2)
{
	Poly p,p1,p3;
	node *q,*k,*m,*n;
	m=head->next;
	while(m->exp!=-1)
	{
		p3=p;
		k=p1.head;
		n=p2.head->next;
		while(n->exp!=-1)
		{
			q=new node;
			q->exp=m->exp+n->exp;
			q->coef=m->coef*n->coef;
			q->next=p1.head;
			k->next=q;
			k=q;
			n=n->next;
		}
		p=p1+p3;
		p1.del_Poly();
		p3.del_Poly();
		m=m->next;

	}
	return p;
}

二.应用实例:

设有两个稀疏多项式如下:

p1(x)=3X10+4X8-5X5+2X4-3X+10;

P2(X)=4X14+3X8-7X6-2X4+5X-6

完成它们的加乘:

#include "Poly.h"
#include <stdlib.h>
int main()
{
	Poly p1,p2,add_p,mul_p;
	int e1[6]={10,8,5,4,1,0};
	double c1[6]={3.0,4.0,-5.0,2.0,-3.0,10.0};
	int e2[6]={14,8,6,4,1,0};
	double c2[6]={4.0,3.0,-7.0,-2.0,5.0,-6.0};
	p1.in2_Poly(6,e1,c1);
	p2.in2_Poly(6,e2,c2);
	//p1.in1_Poly();//键盘输入多项式p1的系数和指数
	//p2.in1_Poly();
	cout<<"输出多项式p1:"<<endl;
	p1.prt_Poly();
	cout<<"输出多项式p2:"<<endl;
	p2.prt_Poly();
	add_p=p1+p2;
	cout<<"输出多项式p=p1+p2:"<<endl;
	add_p.prt_Poly();
	mul_p=p1*p2;
	cout<<"输出多项式p=p1*p2;"<<endl;
	mul_p.prt_Poly();
	p1.del_Poly();
	cout<<"输出多项式p1:"<<endl;
	p1.prt_Poly();
	p2.del_Poly();
	cout<<"输出多项式p2:"<<endl;
	p2.prt_Poly();
	system("pause");
	return 0;



}

三. 实验结果:

输出多项式p1:
(3,10)
(4,8)
(-5,5)
(2,4)
(-3,1)
(10,0)
输出多项式p2:
(4,14)
(3,8)
(-7,6)
(-2,4)
(5,1)
(-6,0)
输出多项式p=p1+p2:
(4,14)
(3,10)
(7,8)
(-7,6)
(-5,5)
(2,1)
(4,0)
输出多项式p=p1*p2;
(12,24)
(16,22)
(-20,19)
(17,18)
(-9,16)
(-12,15)
(6,14)
(-15,13)
(-2,12)
(50,11)
(-32,10)
(21,9)
(2,8)
(21,7)
(-95,6)
(46,5)
(-32,4)
(-15,2)
(68,1)
(-60,0)
输出多项式p1:
空表
输出多项式p2:
空表
请按任意键继续. . .






























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章