一元多项式的求值问题

list.h
#ifndef _LIST_H
#define _LIST_H
#include<iostream>
using namespace std;

typedef struct Data
{
	float coef;			//系数
	int expn;			//指数
}Elemtype;

class List;

class ListNode
{
friend class List;
public:
	ListNode():data(Elemtype()),next(NULL)
	{
	}
	ListNode(const Elemtype &e,ListNode *n = NULL):data(e),next(n)
	{
	}
	~ListNode()
	{
	}
	bool operator!=(Elemtype e)
	{
		return (this->data.coef != e.coef)&&(this->data.expn != e.expn);
	}
private:
	Elemtype data;
	ListNode *next;
};

class List
{
public:
	List()
	{
		first = last = new ListNode;
		size = 0;
	}
	~List()
	{
		
	}
public:
	void DestroyPolyn()
	{
		ListNode *p = first,*q;
		while(p->next)
		{
			q = p->next;
			p = q->next;
			delete q;
		}
		delete first;
		first = last = NULL;
		size = 0;
	}
	void Clear_Polyn()
	{
		ListNode *p = first->next,*q;
		while(p)
		{
			q = p;
			p = p->next;
			delete q;
		}
		last = first;
		size = 0;
	}
	
	void Merge(Elemtype &e)
	{
		ListNode *p = first->next,*q = first;
		while(p != NULL && p->data.expn != e.expn)
		{
			q = p;
			p = p->next;
		}
		if(p != NULL)
		{
			p->data.coef += e.coef;
			if(0 == p->data.coef)
				Delete_Node(p->data);
		}
	}

	bool Find_Expn(int expn)
	{
		ListNode *p = first->next;
		while(p != NULL && p->data.expn != expn)
			p = p->next;
		if(!p)
			return false;
		else
			return true;
	}
	void Insert_Expn(ListNode *p)
	{
		ListNode *q = first;
		while(q->next != NULL && q->next->data.expn < p->data.expn)
			q = q->next;
		p->next = q->next;
		q->next = p;
		if(size == 0)
			last = p;
		++size;
	}
	void CreatPolyn(int m)
	{
		Elemtype e;
		int i;
		ListNode *p = NULL;
		
		cout<<"请依次输入"<<m<<"个系数,指数:"<<endl;
		for(i = 0; i < m; ++i)
		{
			cin>>e.coef>>e.expn;
			if(!Find_Expn(e.expn))
			{
				p = new ListNode(e);
				Insert_Expn(p);
			}
		}
	}
	
	void PrintPolyn()
	{
		ListNode *p;
		p = first->next;
		cout<<"指数     系数"<<endl;
		while(p)
		{
			cout<<p->data.coef<<"        "<<p->data.expn<<endl;
			p = p->next;
		}
	}
	int cmp(Elemtype a,Elemtype b)
	{
		if(a.expn < b.expn)
			return -1;
		else if(a.expn == b.expn)
			return 0;
		else if(a.expn > b.expn)
			return 1;
	}
	bool Is_Full()
	{
		if(first->next == NULL)
			return true;
		else
			return false;
	}
	void Delete_Node(Elemtype &e)	 //删除结点
	{
		if(Is_Full())
			return;
		ListNode *q = first->next,*t = first;
		while(q != NULL && (*q) != e)
			{
				t = q;
				q = q->next;	
			}
		if(q == NULL)
			return;
		else
		t->next = q->next;
		delete q;
		q = NULL;
		--size;
	}
	void AddPolyn(List &L)
	{	//多项式加法, pa = pa + pb,并摧毁一元多项式
		ListNode *ha,*hb,*qa,*qb;
		
		Elemtype a,b;
		ha = first;
		hb = L.first;		//ha和hb分别指向头结点
		qa = ha->next;
		qb = hb->next;		//qa和qb分别指向第一个结点
		
		while(!Is_Full() && !L.Is_Full() && qa && qb)
		{
			a = qa->data;
			b = qb->data;	//a和b分别指向两个链表当前元素

			switch(cmp(a,b))
			{
				case -1://qa的指数<qb的指数
						ha = qa;			//ha向后移动
						qa = ha->next;		//qa向后移动
						break;
				case 0:
						qa->data.coef += qb->data.coef;//两者的指数相等,修改pa所指的系数
						if(0 == qa->data.coef)	//删除当前结点
							Delete_Node(qa->data);
						else
							ha = qa;
						L.Delete_Node(qb->data);
						qb = hb->next;
						qa = ha->next;
						break;

				case 1:			//多项式pa大于pb;
						ListNode *p = new ListNode(qb->data);
						L.Delete_Node(qb->data);
						Insert_Expn(p);
						ha = ha->next;
						qb = hb->next;
						break;
			}
		}
		if(!L.Is_Full())
		{
			while(qb != NULL)		//链接L中剩余结点
			{
				hb = qb;
				qb = qb->next;
				Insert_Expn(hb);
			}
		}
		L.DestroyPolyn();
	}
	void Opposite()			//一元多项式系数取反
	{
		ListNode *p;
		p = first;
		while(p->next)
		{
			p = p->next;
			p->data.coef *= -1;
		}
	}
	void SubtractPolyn(List &L)		//减法
	{
		L.Opposite();
		AddPolyn(L);
	}
	void MultiplyPolyn(List &L)		//乘法
	{
		List pc;
		ListNode *qa,*qb;
		Elemtype a,b,c;
		qa = first->next;
		while(qa)
		{
			a = qa->data;
			qb = L.first->next;
			while(qb)
			{
				b = qb->data;
				c.coef = a.coef * b.coef;
				c.expn = a.expn + b.expn;
					if(pc.Find_Expn(c.expn))	//如果已经存在该项指数
						pc.Merge(c);			//合并系数
					else
					{
						ListNode *p = new ListNode(c);	//不存在的话直接插入
						pc.Insert_Expn(p);
					}
				qb = qb->next;
			}
			qa = qa->next;
		}
		L.DestroyPolyn();	//摧毁L链表
		Clear_Polyn();		//将本身的链表清空
		first = pc.first;
		last = pc.last;
		size = pc.size;
	}
private:
	ListNode *first;	//头结点
	ListNode *last;		//尾结点
	size_t	 size;		//个数
};
#endif


#include"list.h"

int main()
{
	List my_list1,my_list2;
	int m;
	cout<<"请输入第一个非零多项式的个数:>";
	cin>>m;
	my_list1.CreatPolyn(m);
	my_list1.PrintPolyn();
	
	cout<<"请输入第二个非零多项式的个数:>";
	cin>>m;
	my_list2.CreatPolyn(m);
	my_list2.PrintPolyn();
	
	//my_list1.AddPolyn(my_list2);
	//cout<<"相加后的结果为:"<<endl;
	//my_list1.PrintPolyn();

	//cout<<"相减后的结果为:"<<endl;
	//my_list1.SubtractPolyn(my_list2);
	//my_list1.PrintPolyn();
	
	//my_list1.MultiplyPolyn(my_list2);
	//cout<<"相乘后的结果为:"<<endl;
	//my_list1.PrintPolyn();

	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值