JAVA设计模式之享元模式

#include<iostream>
using namespace std;
struct LNode{   //节点类
	double p;//系数项
	int  e;//指数项
	LNode * next;
};
class LsList{//一元多项式链式线性表
private:
	LNode head;//头结点
	size_t size;//节点个数
	double mx;//一元多项式的变量值
public:
	LNode & GetHead(){return head;}
	size_t & GetSize(){return size;}
	size_t GetSize() const {return size;}
	LsList()
	{//初始化一个空的线性表
		size = 0;
		head.next = 0;
		mx = 0;
	}

//初始化一元多项式线性表中的系数项、指数项
 LsList(double ps[],int es[],int n)//ps代表系数项数组,es代表指数项数组,n代表该一元多项式的个数
{
	size = 0;
	head.next = 0;
	mx = 0;
	int i =0;
	LNode * p = &head;
	for(;i<n;i++)
	{
		LNode * p1 = (LNode*)malloc(sizeof(LNode));
		p1->e = es[i];
		p1->p = ps[i];
		p->next = p1;
		p = p->next;
		size++;
	}
	p->next = 0;
}
//复制构造函数
	LsList(LsList &list2)
{
	size = 0;
	head.next = 0;
	mx = 0;
	LNode * p = &head;
	LNode *p1  = list2.GetHead().next;
	while(p1!=0)
	{
		LNode * p2 = (LNode*)malloc(sizeof(LNode));
		p2->e = p1->e;
		p2->p = p1->p;
		p->next = p2;
		p1 = p1->next;
		p = p->next;
		size++;
	}
	p->next = 0;
}
//赋值操作符重载
LsList & operator=(LsList &list2)
{
	
	clear();
	LNode * p = &head;
	LNode *p1  = list2.GetHead().next;
	while(p1!=0)
	{
		LNode * p2 = (LNode*)malloc(sizeof(LNode));
		p2->e = p1->e;
		p2->p = p1->p;
		p->next = p2;
		p1 = p1->next;
		p = p->next;
		size++;
	}
	p->next = 0;
	return *this;
}


//设置该一元多项式的变量值X
void SetX(double d)
{
  mx = d;
}

//清空一个线性表
void clear()
{

	LNode * p = head.next;
	while(p!=0)
	{
		LNode * p2 = p->next;
		free(p);
		p = p2;
	}
	size = 0;
	head.next = 0;
	mx = 0;
}

//打印该一元线性表
void PrintLsList()
{
	if(mx==0)
	{
	 cout<<"请先设置变量x值"<<endl;
	 return ;
	}
	LNode * p = head.next;
	while(p!=0)
	{
		cout<<p->p<<"*"<<mx<<"^"<<p->e;
		p = p->next;
		if(p!=0&&p->p>0) 
		cout<<"+";
	}
}

//计算该一元多项式结果
double GetResult()
{
 double sum =0;
 if(mx==0)
	{
	 cout<<"请先设置变量x值"<<endl;
	 return -1;
	}
 LNode * p = head.next;
 while(p!=0)
	{
		sum+=(p->p)*pow(mx,p->e);
		p = p->next;
	}
 return sum;
}

//删除多项式中的某一项数据
bool DeleElem(int e)
{  
	LNode * p1 = &head;
	LNode * p = p1->next;
     while(p!=0)
	{
		if(p->e==e)
		{  
			p1->next = p->next;
			free(p);
			size--;
			return true;
		}
		p1 = p1->next;
		p =  p1->next;
	}
	 return false;
}


//给多项式添加一项数据
void AddElem(double pi,int ei)
{
	
	LNode * p = head.next;

	if(p==0)
	{
	    LNode * p2 = (LNode*)malloc(sizeof(LNode));
		p2->e =ei;
		p2->p = pi;
		head.next = p2;
		size++;
		p2->next = 0;
		return;
	}
	if(p->e>ei)
	{
		LNode * p2 = (LNode*)malloc(sizeof(LNode));
		p2->e =ei;
		p2->p = pi;
		head.next = p2;
		p2->next = p;
		size++;
		return;
	}

     while(p!=0)
	{
		if(p->e == ei)
		{
			if(( p->p + pi)==0)
			{
			 DeleElem(ei);//删除
			 return;
			}
			else
			{
				p->p += pi;
			    return;
			}
		}
		if((p->e<ei && p->next!=0 && p->next->e>ei)||(p->e<ei&&p->next==0))
		{
		  LNode * p2 = (LNode*)malloc(sizeof(LNode));
		  p2->e =ei;
		  p2->p = pi;
		  p2->next = p->next;
		  p->next = p2;
		  size++;
		  return ;
		}
		p = p->next;
	}

}

//完成多项式的相加运算,并销毁多项式list2
void AddList(LsList &list2)
{
	int s1 = size;
	int n=0;
	size =0;
	LNode * p1 = head.next;
	LNode * p = &head;
	LNode * p2 = list2.GetHead().next;

	while(p1!=0&&p2!=0)
	{
		if(p1->e < p2->e)
		{
			p->next = p1;
			p1 = p1->next;
			p = p->next;
			size++;
		}
		else
		{
		if(p1->e > p2->e)
			{
				p->next = p2;
				p2 = p2->next;
				p = p->next;
				size++;
			}
			else{
				double db = (p1->p)+(p2->p);
				if(db!=0)
				{
					p1->p  = db;
					p->next = p1;
					p = p->next;
					size++;
					p1 = p1->next;
					LNode * p3 = p2->next;
					free(p2);
					p2=p3;
					size++;

				}
				if(db==0)
				{
					LNode * pa = p1->next;
					LNode * pb = p2->next;
					free(p1);
					free(p2);
					p1 = pa;
					p2 = pb;
					n++;
				}
			}
		}
	
	}


	if(p1==0)
	{
	p->next = p2;
	size += list2.GetSize() - size - n;
	}
	else
	{
	p->next = p1;
	size += s1 - size - n;
	}

	list2.GetHead().next = 0;
}

//完成多项式的相减运算,并销毁多项式list2
void Sub(LsList &list2)
{
	LNode *p  = list2.GetHead().next;
	while(p!=0)
	{
		p->p = -(p->p);
		p = p->next;
	}
	AddList(list2);
}

//完成多项式的相乘运算,并销毁多项式list2
void Mul(LsList &list2)
{
	LNode *p  = list2.GetHead().next;
	LsList ili = *this;
	while(p!=0)
	{
		LsList li = ili;
		for(LNode * p1 = li.GetHead().next;p1!=0;p1 = p1->next)
		{
			p1->p = (p1->p)*(p->p);
			p1->e = p1->e + p->e;
		}
		AddList(li);
		p = p->next;
	}
}

////完成多项式的相除运算,并销毁多项式list2
//void Devi()
//{
//
//
//}
};

int main()
{
	/*
	*测试一
	*/
//创建一个空的线性表
	LsList list1;
//给该空的线性表添加项信息
	list1.AddElem(1,2);
	list1.AddElem(1.5,3);
	list1.AddElem(2,4);
//设置该一元多项式的变量x的值
	list1.SetX(3);
	cout<<endl;
	cout<<"创建一个空的线性表后添加每项的数据"<<endl;
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
	list1.PrintLsList();
//输出该一元多项式的表达式和求值
	cout<<" = "<<list1.GetResult()<<endl;

	/*
	*测试二
	*/
//用每项的信息数组初始化线性表
	double ps[5] = {1,2.5,3,5.4,6};//每项的系数信息数组
	int es[5] = {1,2,4,6,7};//每项的指数信息数组
	LsList list2(ps,es,5);
//设置该一元多项式的变量x的值
	list2.SetX(2);
	cout<<endl;
	cout<<"用每项的信息数组初始化线性表"<<endl;
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	list2.PrintLsList();
	cout<<" = "<<list2.GetResult()<<endl;

	/*
	*测试三
	*/
//直接赋值构造一个一元多项式线性表对象
	LsList list3 = list2;
//设置该一元多项式的变量x的值
	list3.SetX(2);
	cout<<endl;
	cout<<"直接赋值构造一个一元多项式线性表对象"<<endl;
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	list3.PrintLsList();
	cout<<" = "<<list3.GetResult()<<endl;
//给该线性表再添加一项数据
	cout<<endl;
	cout<<"给该线性表再添加一项数据:其中系数为4,指数为5"<<endl;
	list3.AddElem(4,5);
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	list3.PrintLsList();
	cout<<" = "<<list3.GetResult()<<endl;
//给该线性表再添加一项数据
	cout<<endl;
	cout<<"给该线性表再添加一项数据:其中系数为-1,指数为2"<<endl;
	list3.AddElem(-1,2);
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	list3.PrintLsList();
	cout<<" = "<<list3.GetResult()<<endl;
//删除线性表中的一项数据信息
	cout<<endl;
	cout<<"删除该一元多项式中指数项为2的项"<<endl;
	list3.DeleElem(2);
	cout<<"输出该一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	list3.PrintLsList();
	cout<<" = "<<list3.GetResult()<<endl;


	/*
	*测试四
	*/
	LsList myList = list2;
	LsList myList1 = list3;
	myList.SetX(2);
	myList1.SetX(2);
	cout<<endl;
	cout<<"输出该一元多项式list2的表达式:"<<endl;
//输出该一元多项式的表达式
	list2.PrintLsList();
	cout<<" = "<<list2.GetResult()<<endl;
	cout<<endl;

	cout<<endl;
cout<<"输出该一元多项式list3的表达式:"<<endl;
//输出该一元多项式的表达式
	myList1.PrintLsList();
	cout<<" = "<<myList1.GetResult()<<endl;
	cout<<endl;
//将list2一元多项式加上list3一元多项式
	myList.AddList(myList1);
	cout<<endl;
	cout<<"输出将list2一元多项式加上list3一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	myList.PrintLsList();
	cout<<" = "<<myList.GetResult()<<endl;


//将list2一元多项式减去list3一元多项式
	LsList myList3 = list2;
	LsList myList4 = list3;
	myList3.SetX(2);
	myList4.SetX(2);
	myList3.Sub(myList4);
	cout<<endl;
	cout<<"输出将list2一元多项式减去list3一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	myList3.PrintLsList();
	cout<<" = "<<myList3.GetResult()<<endl;

//将list2一元多项式乘以list3一元多项式
	
	myList3 = list2;
	myList4 = list3;
	myList3.SetX(2);
	myList4.SetX(2);
	myList3.Mul(myList4);
	cout<<endl;
	cout<<"输出将list2一元多项式乘以list3一元多项式的表达式和求值:"<<endl;
//输出该一元多项式的表达式和求值
	myList3.PrintLsList();
	cout<<" = "<<myList3.GetResult()<<endl;

	list2.clear();
	list3.clear();
return 0;
}


JAVA设计模式之享元模式,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。