链式线性表表示和求解一元多项式问题(一)

2014-11-23 23:37:55 · 作者: · 浏览: 2
#include
  
   
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
  
   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值"<
   
    p<<"*"<
    
     e; p = p->next; if(p!=0&&p->p>0) cout<<"+"; } } //计算该一元多项式结果 double GetResult() { double sum =0; if(mx==0) { cout<<"请先设置变量x值"<
     
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 next!=0 && p->next->e>ei)||(p->e 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