设为首页 加入收藏

TOP

求两个多项式相加运算
2014-11-23 21:46:42 来源: 作者: 【 】 浏览:12
Tags:两个 多项 相加 运算
#include
#include
using namespace std;
#define MAX 20            //多项式最多项数

typedef struct               //定义存放多项式的数组类型
{
	float coef;              //系数
	int exp;				 //指数
}PolyArray[MAX];

typedef struct pNode         //定义单链表结点类型
{
	float coef;
	int exp;
	struct pNode *next;
}PolyNode;

void DispPoly(PolyNode * L)   //输出多项式
{
	PolyNode *p=L->next;
	while(p!=NULL)
	{
		printf("%gX^%d",p->coef,p->exp);
		p=p->next;
	}
	printf("\n");
}

void CreateListR(PolyNode * &L,PolyArray a,int n)     //尾插法建表
{
	PolyNode *s,*r;
	int i;
	L=(PolyNode *)malloc(sizeof(PolyNode));           //创建头结点
	L->next=NULL;
	r=L;											  //r始终指向终端结点,开始时指向头结点
	for(i=0;icoef=a[i].coef;
		s->exp=a[i].exp;
		r->next=s;									  //将*s插入*r后
		r=s;
	}
	r->next=NULL;                                     //终端结点next域置为NULL
}

void Sort(PolyNode * &head)                           //按exp域递减排序
{
	PolyNode *p=head->next,*q,*r;
	if(p!=NULL)                                       //若原单链表中有一个或多个数据结点
	{
		r=p->next;                                    //r保存*p结点的后继结点的指针
		p->next=NULL;                                 //构造只含一个数据结点的有序表
	    p=r;
		while(p!=NULL)
		{
			r=p->next;                                 //r保存*p结点的后继结点的指针
			q=head;
			while(q->next!=NULL&&q->next->exp>p->exp)
				q=q->next;                            //在有序表中找插入*p的前驱结点*q
			p->next=q->next;                          //将*p插入到*q之后
			q->next=p;
			p=r;
		}
	}
}

void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)     //求两个有序集合的并
{
	PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
	float c;
	hc=(PolyNode *)malloc(sizeof(PolyNode));          //创建头结点
	tc=hc; 
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->exp >pb->exp)
		{
			s=(PolyNode *)malloc(sizeof(PolyNode));   //复制结点
			s->exp=pa->exp;
			s->coef=pa->coef;
			tc->next=s;
			tc=s;
			pa=pa->next;
		}
		else if(pa->exp exp)
		{
			s=(PolyNode *)malloc(sizeof(PolyNode));  //复制结点
			s->exp=pb->exp;
			s->coef=pb->coef;
			tc->next=s;
			tc=s;
			pb=pb->next;
		}
		else                                       //pa->exp==pb->exp
		{
			c=pa->coef+pb->coef;
			if(c!=0)                               //系数之和不为0时创建新结点
			{
				s=(PolyNode *)malloc(sizeof(PolyNode)); 
				s->exp=pa->exp;
				s->coef=c;
				tc->next=s;
				tc=s;
			}
			pa=pa->next;
			pb=pb->next;
		}
	}
	if(pb!=NULL)
		pa=pb;									    //复制余下的结点
	while(pa!=NULL)
	{
		s=(PolyNode *)malloc(sizeof(PolyNode)); 
		s->exp=pa->exp;
		s->coef=pa->coef;
		tc->next=s;
		tc=s;
		pa=pa->next;
	}
	tc->next=NULL;
}

void main()
{
	PolyNode *ha,*hb,*hc;
	PolyArray a={{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};
	PolyArray b={{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};
	CreateListR(ha,a,4);
	CreateListR(hb,b,5);
	printf("原多项式A:");
	DispPoly(ha);
	printf("原多项式B:");
	DispPoly(hb);
	Sort(ha);
	Sort(hb);
	printf("排序后多项式A:");
	DispPoly(ha);
	printf("排序后多项式B:");
	DispPoly(hb);

	Add(ha,hb,hc);
	printf("多项式相加:");
	DispPoly(hc);

}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva 540 Team Queue 下一篇CH BR8(小学生在上课-逆元和互质..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)
·基于Python的数据分 (2025-12-27 07:50:03)
·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)