多项式相乘与相加演示

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int p;
	int e;
	struct node *next;
}Polynomial,*P_Polynomial;
P_Polynomial  Input()
{//输入多项式
	P_Polynomial p1,p2,head;
	head=p2=(P_Polynomial)malloc(sizeof(Polynomial));
	p1=(P_Polynomial)malloc(sizeof(Polynomial));
	printf("\n请输入多项式的系数和幂值\n(注:以幂值为0结束)\n");
	scanf("%d %d",&p1->p,&p1->e);
    while(p1->e!=0)
	{
		p2->next=p1;
		p2=p1;
        p1=(P_Polynomial)malloc(sizeof(Polynomial));
		scanf("%d %d",&p1->p,&p1->e);
	}
	p2->next=NULL;
	free(p1);
	return head;
}
void Add_polynomial(P_Polynomial p1,P_Polynomial p2)
{//多项式相加
	P_Polynomial pre_p1,cur_p1,cur_p2;
	pre_p1=p1;//p1的前指针
	cur_p1=p1->next;
	cur_p1=p2->next;// p1和p2的当前指针
	while(cur_p1&&cur_p2)
	{
		if(cur_p1->e==cur_p2->e)// 如果p1和p2的幂相等,则相加并入p1
		{
			cur_p1->p=cur_p1->p+cur_p2->p;
			if(cur_p1->p==0)//if p==0
			{
				pre_p1->next=cur_p1->next;
				free(cur_p1);
				cur_p1=pre_p1->next;
				cur_p2=cur_p2->next;		
			}
			else// if p!=0
			{
				pre_p1=cur_p1;
				cur_p1=cur_p1->next;
				cur_p2=cur_p2->next;
			}
		}
		continue;//continue find...
		if(cur_p1->e<cur_p2->e)
		{
			pre_p1=cur_p1;
			cur_p1=cur_p1->next;
		}
		else
		{
			P_Polynomial temp;
			if(!(temp=(P_Polynomial)malloc(sizeof(Polynomial))))
			{
				printf("内存不足。。。");
				exit(0);
			}
			temp->p=cur_p2->p;
			temp->e=cur_p2->e;
			temp->next=cur_p1;
			pre_p1->next=temp;
			pre_p1=pre_p1->next;
			cur_p2=cur_p2->next;//在p1中插入p2
		}
	}
	while(cur_p2)
	{
		P_Polynomial temp;
		if(!(temp=(P_Polynomial)malloc(sizeof(Polynomial))))
		{
				printf("内存不足。。。");
				exit(0);
		}
		temp->p=cur_p2->p;
		temp->e=cur_p2->e;
		temp->next=NULL;
		pre_p1->next=temp;
		pre_p1=pre_p1->next;
		cur_p2=cur_p2->next;
	}
}
P_Polynomial Mul_polynomial(P_Polynomial *exp1,P_Polynomial *exp2)
{//多项式相乘
	P_Polynomial head,p1,p2,last,pre,px,q;
	int flag=1;
	head=p1=*exp1;
	p1=p1->next;
	for(;p1->next!=NULL;p1=p1->next);
	px=last=p1;
	p1=(*exp1)->next;
	while(p1!=px->next)
	{
		pre=p1;
		flag=1;
		p2=(*exp2)->next;
		while(p2)
		{
			if(flag)
			{
				p1->p=p1->p*p2->p;
				p1->e=p1->e+p2->e;
				p2=p2->next;
				flag=0;
			}
			else
			{
			   q=(P_Polynomial)malloc(sizeof(Polynomial));
			   q->p=pre->p*p2->p;
			   q->e=pre->e+p2->e;
               last->next=q;
			   last=q;
			   p2=p2->next;
			}
		}
      p1=p1->next;
	  last->next=NULL;
	}
	return head;
}
P_Polynomial Sort_polynomial(P_Polynomial pol)
{//对多项式排序,
	P_Polynomial head=pol,p,q,r,t;
	if(head->next==NULL)
		printf("input error!!!	");
	else
	{
      p=head->next;
	  q=p->next;
	  p->next=NULL;
	  p=q;
	}
	while(p!=NULL)
	{
		r = head;
		q = r->next;
		while(q != NULL&& q->e < p->e)
		{
			r = q;
			q = q->next;
		}
         t=p->next; 
	     p->next=r->next;
		 r->next=p;
		 p=t;
	}
	return(head);
}
P_Polynomial Combine_polynomial(P_Polynomial head)
{//对指数相同的多项式进行合并。。
	P_Polynomial p1,p2;
	p1=head->next;
	while(p1->next!=NULL)
	{
		if(p1->next->e==p1->e)
		{
			p2=p1->next;
			p1->e=p1->e+p2->e;
			p1->next=p1->next->next;
			free(p2);
		}
		else
		{
			p1=p1->next;
		}
	}
	return head;
}
void output(P_Polynomial head)
{
	P_Polynomial p1;
	p1=head->next;
	while(p1!=NULL)
	{
		if(p1->e<0&&p1!=NULL)
	       printf("\b\b");
		printf("%dX(%d)+",p1->p,p1->e);
		p1=p1->next;
	}
	printf("\b");
	printf("\n");
}
int main()
{
	P_Polynomial p1,p2,add,mul;
	printf("please input p1:\n");
	p1=Input();
	printf("please input p2:\n");
	p2=Input();
//	printf("p1+p2=");
//	   add=Add_polynomial(p1,p2);
	//   output(add);n
	printf("p1*p2=");
	   mul=Mul_polynomial(&p1,&p2);
	   Sort_polynomial(mul);
	   Combine_polynomial(mul);
	   output(mul);
  return 0;
	
}


posted @ 2013-07-15 20:53  爱生活,爱编程  阅读(307)  评论(0编辑  收藏  举报