求两个多项式相加运算

#include<iostream>
#include<malloc.h>
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;i<n;i++)
	{
		s=(PolyNode *)malloc(sizeof(PolyNode));       //创建新结点
		s->coef=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 <pb->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);

}


posted @ 2013-07-31 19:48  javawebsoa  Views(635)  Comments(0Edit  收藏  举报