PTA 一元多项式的乘法与加法运算(链表)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode *Polynomial;
struct PolyNode
{
    int coef;
    int expon;
    Polynomial link;
};
void Attach(int c,int e,Polynomial *pRear)
{
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*pRear)->link=P;
    *pRear=P;
}
Polynomial ReadPoly()
{
    Polynomial P,Rear,t;
    int c,e,N;
    scanf("%d",&N);
    P=(Polynomial)malloc(sizeof(struct PolyNode));//申请空节点
    P->link=NULL;
    Rear=P;
    while(N--)
    {
        scanf("%d%d",&c,&e);
        Attach(c,e,&Rear);//插入多项式尾部
    }
    t=P;P=P->link;
    free(t);//删除临时生成的空节点
    return P;
}
/*
Polynomial ReadPoly()
{
	Polynomial head,tail,p;
	head=tail=NULL;
	int n;
	scanf("%d",&n);
	while(n--)
	{
		p=(Polynomial)malloc(sizeof(struct PolyNode));
		scanf("%d%d",&p->coef,&p->expon);
		p->link=NULL;
		if(head==NULL)
		  head=p;
		else
		  tail->link=p;
		tail=p;     
	}
	return head;
}
*/
int Compare( int e1, int e2 )
{   /*比较两项指数e1和e2,根据大、小、等三种情况分别返回1,-1,0 */
	if ( e1 > e2 ) return 1;     /* e1大,返回1 */
	else if ( e1 < e2 ) return -1;    /* e2大,返回-1 */
	else  return 0;     /* e1和e2相等,返回0 */
}
Polynomial  PolyAdd (Polynomial P1, Polynomial P2)
{
	Polynomial front, rear, temp;
	int sum;
	
	/* 为方便表头插入,先产生一个临时空结点作为结果多项式链表头 */
	rear = (Polynomial) malloc(sizeof(struct PolyNode));  
	front = rear;        /* 由front 记录结果多项式链表头结点 */
	while ( P1 && P2 )  /* 当两个多项式都有非零项待处理时 */
		switch ( Compare(P1->expon, P2->expon) ) {
			case 1: /* P1中的数据项指数较大 */
				Attach( P1->coef, P1->expon, &rear);
				P1 = P1->link;
				break;
			case -1: /* P2中的数据项指数较大 */
				Attach(P2->coef, P2->expon, &rear); 
				P2 = P2->link;
				break;
			case 0:  /* 两数据项指数相等 */
				sum = P1->coef + P2->coef;
				if ( sum ) Attach(sum, P1->expon, &rear);
				P1 = P1->link; 
				P2 = P2->link;
				break;
	}
	/* 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去 */
	for ( ; P1; P1 = P1->link ) Attach(P1->coef, P1->expon, &rear);
	for ( ; P2; P2 = P2->link ) Attach(P2->coef, P2->expon, &rear);
	rear->link = NULL; 
	temp = front;
	front = front->link; /*令front指向结果多项式第一个非零项 */
	
	free(temp);    /* 释放临时空表头结点 */
	return front;
} 
Polynomial PolyMulti (Polynomial P1, Polynomial P2)
{
    Polynomial P,temp,ptr1,ptr2,t;
    int c,e;
    if(!P1||!P2)//一个链表为空则返回空
      return NULL;
    ptr1=P1;
	ptr2=P2;
	P=(Polynomial)malloc(sizeof(struct PolyNode));
	P->link=NULL;
	temp=P;  
	while(ptr2)//创建初始链表
	{
		Attach(ptr1->coef*ptr2->coef,ptr1->expon+ptr2->expon,&temp);
		ptr2=ptr2->link;
	}
	ptr1=ptr1->link;
    for(; ptr1; ptr1=ptr1->link)
    {
    	temp=P;
		for(ptr2=P2; ptr2; ptr2=ptr2->link)
		{
	        c=ptr1->coef*ptr2->coef;
	        e=ptr1->expon+ptr2->expon;
	        while(temp->link&&temp->link->expon>e)//找插入位置
	          temp=temp->link;
	        if(temp->link&&temp->link->expon==e)//指数相等系数相加
			{
				if(temp->link->coef+c)
				  temp->link->coef+=c;
				else//系数相加为零则删去节点,仅保留非零项
				{
					t=temp->link;
					temp->link=t->link;
					free(t);
				  }  
			  }  
			else//系数不相等则插入
			{
				t=(Polynomial)malloc(sizeof(struct PolyNode));
				t->coef=c;
				t->expon=e;
				t->link=temp->link;
				temp->link=t;
				temp=temp->link;
			  }  
        }
	}
    ptr2=P;
	P=P->link;
	free(ptr2);    
    return P;
}
/*将多项式乘法转换为多项式加法
Polynomial PolyMulti (Polynomial P1, Polynomial P2)
{
    Polynomial P=NULL,temp,ptr1,ptr2;
    for(ptr1=P1;ptr1;ptr1=ptr1->link)
      for(ptr2=P2;ptr2;ptr2=ptr2->link)
      {
      	temp=(Polynomial)malloc(sizeof(struct PolyNode));
      	temp->coef=ptr1->coef*ptr2->coef;
      	temp->expon=ptr1->expon+ptr2->expon;
      	temp->link=NULL;
      	P=PolyAdd(P,temp);
	  }
    return P;
}
*/
void PrintPoly(Polynomial P)
{
	int flag=0;
	if(!P)//零多项式
    {
        printf("0 0\n");
        return;
    }
	while(P)
	{
		if(!flag)
		  flag=1;
		else
		  printf(" ");
		printf("%d %d",P->coef,P->expon);
		P=P->link;    
	}
	printf("\n");
}
int main()
{
    Polynomial P1,P2,PP,PS;
    P1=ReadPoly();//读入第一个多项式
    P2=ReadPoly();//读入第二个多项式
    PP=PolyMulti(P1,P2);//两个多项式相乘
    PrintPoly(PP);//输出
    PS=PolyAdd(P1,P2);//两个多项式相加
    PrintPoly(PS);//输出
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43723935/article/details/89209784