• 7-2 一元多项式的乘法与加法运算 (20 分)


    #include <cstdio>
    #include <cstdlib>
    // 多项式相乘 相加
    // 数据结构设计
    typedef struct PolyNode *Polynomial;
    struct PolyNode
    {
    	int coef;
    	int expon;
    	Polynomial link;
    }; 
    
    Polynomial ReadPoly();
    void Attach(int c, int e, Polynomial *pRear);
    Polynomial Add(Polynomial P1, Polynomial P2);
    Polynomial Mult(Polynomial P1, Polynomial P2);
    void PrintPoly(Polynomial P);
    int Compare(int a, int b);
    
    // 程序框架搭建
    int main()
    {
    	Polynomial P1, P2, PP, PS;
    	
    	P1 = ReadPoly();
    	P2 = ReadPoly();
    	PP = Mult(P1, P2);
    	PrintPoly(PP);
    	PS = Add(P1, P2);
    	PrintPoly(PS);
    	
    	return 0;
    } 
    
    // 如何读入多项式
    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;
    } 
    
    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;	// 修改pRear的值 
    }
    
    int Compare(int a, int b)
    {
    	if(a > b)	return 1;
    	else if(a < b)	return -1;
    	else	return 0;
    }
    
    // 多项式相加
    Polynomial Add(Polynomial P1, Polynomial P2)
    {
    	Polynomial P, Rear, t, t1, t2;
    	t1 = P1; t2 = P2;
    	P = (Polynomial)malloc(sizeof(struct PolyNode));
    	P->link = NULL;
    	Rear = P;
    	while(t1 && t2)
    	{
    		switch(Compare(t1->expon, t2->expon))
    		{
    			case 1:
    				Attach(t1->coef, t1->expon, &Rear);
    				t1 = t1->link;
    				break;
    			case -1:
    				Attach(t2->coef, t2->expon, &Rear);
    				t2 = t2->link;
    				break;
    			case 0:
    				if(t1->coef + t2->coef)	Attach(t1->coef + t2->coef, t1->expon, &Rear);
    				t1 = t1->link;
    				t2 = t2->link;
    				break;
    		}
    	}
    	for(; t1; t1 = t1->link)	Attach(t1->coef, t1->expon, &Rear);
    	for(; t2; t2 = t2->link)	Attach(t2->coef, t2->expon, &Rear);
    	Rear->link = NULL;
    	t = P;
    	P = P->link;
    	free(t);
    	return P;
    } 
    
    // 多项式相乘
    Polynomial Mult(Polynomial P1, Polynomial P2)
    {
    	Polynomial P, Rear, t1, t2, t;
    	int c, e;
    	
    	if(!P1 || !P2)	return NULL;
    	
    	t1 = P1; t2 = P2;
    	P = (Polynomial)malloc(sizeof(struct PolyNode));
    	P->link = NULL;
    	Rear = P;
    	while(t2)
    	{
    		Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);
    		t2 = t2->link;
    	}
    	t1 = t1->link;
    	 
    	while(t1)
    	{
    		t2 = P2; Rear = P;
    		while(t2)
    		{
    			e = t1->expon + t2->expon;
    			c = t1->coef * t2->coef;
    			while(Rear->link && Rear->link->expon > e)
    				Rear = Rear->link;
    			if(Rear->link && Rear->link->expon == e)
    			{	// 指数的系数相等 
    				if(Rear->link->coef + c)
    					Rear->link->coef += c;
    				else {
    					t = Rear->link;
    					Rear->link = t->link;
    					free(t);
    				}	
    			}
    			else	// 指数的系数不相等 
    			{
    				t = (Polynomial)malloc(sizeof(struct PolyNode));
    				t->coef = c;
    				t->expon = e;
    				t->link = Rear->link;
    				Rear->link = t;
    				Rear = Rear->link;
    			}
    			t2 = t2->link; 
    		}
    		t1 = t1->link;
    	}
    	t2 = P;
    	P = P->link;
    	free(t2);
    	
    	return P;
    } 
    
    // 如何将多项式输出
    void PrintPoly(Polynomial P)
    {
    	int flag = 0;	// 辅助调整输出格式用 
    	
    	if(!P)	
    	{
    		printf("0 0
    ");
    		return ;
    	}
    	
    	while(P)
    	{
    		if(!flag)	flag = 1;
    		else	printf(" ");
    		
    		printf("%d %d", P->coef, P->expon);
    		P = P->link;
    	}
    	printf("
    ");
    } 
    

      

  • 相关阅读:
    tomcat 支持https
    linux环境下jdk 安装以及maven私服搭建
    消息中间间初识
    HDU 5527 Too Rich
    HDU 5534 Partial Tree
    HDU 5543 Pick The Sticks
    HDU 5542 The Battle of Chibi dp+树状数组
    CodeForces 842D Vitya and Strange Lesson
    Codeforces 858D Polycarp's phone book
    HDU 5489 Removed Interval
  • 原文地址:https://www.cnblogs.com/mjn1/p/11448325.html
Copyright © 2020-2023  润新知