zoukankan      html  css  js  c++  java
  • 链表的应用:单元多项式的加法、减法、乘法

    使用链表来实现单元多项式的加法、减法、乘法。一个单元多项式的节点结构无非是这种:系数域、指数域、链域。

    例如以下图:

    我们使用链表来模拟单元多项式的常见运算。

    当中,加法是其他运算的基础。减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2。可用poly1乘以poly2的每一项,相加其乘积结果。

    单元多项式的节点结构类型是这种:

    typedef struct node
    {
    	float coef;   //系数 
    	int expn;     //指数 
    	struct node *next;
    }PolyNode;      //多项式节点 polynomial node 

    多项式的加法我们提供了两种:

    1.Polynomial polyAdd(Polynomial poly1, Polynomial poly2),把poly1和poly2相加得到一个新的多项式。相加的过程中poly1和poly2保持不变,不会被破坏。

    2.void add(Polynomial poly1, Polynomial poly2),把poly2加到poly1上。相加的过程中poly2的节点会被利用上。结束后。poly2不存在了。


    提供第一种加法,是为了保持poly1和poly2不变,以便进行下一次的运算。提供另外一种加法,是为了运算结束后,内存不会泄露。

    其他详细细节得看代码了:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node
    {
    	float coef;   //系数 
    	int expn;     //指数 
    	struct node *next;
    }PolyNode;      //多项式节点 polynomial node 
    typedef PolyNode* Polynomial;
    Polynomial createPolynomial()   //创建多项式 
    {
    	PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点 
    	head->next = NULL;
    	float coef;
    	int expn;
    	printf("输入该多项式每一项的系数和指数。每项一行。输入0 0结束!
    ");
    	while (scanf("%f %d", &coef, &expn) && coef)    // 默认,按指数递减排列 
    	{
    		if (head->next)
    		{
    			p = head;
    			while (p->next && expn < p->next->expn)
    				p = p->next;
    			if (p->next)
    			{
    				if (expn == p->next->expn)  //有同样指数的直接把系数加到原多项式 
    				{
    					p->next->coef += coef;
    					//若是相加后系数为0。则舍弃该节点 
    					if (p->next->coef > -0.000001 && p->next->coef < 0.000001)
    					{
    						q = p->next;
    						p->next = q->next;
    						free(q);
    					}
    				}
    				else
    				{
    					q = (PolyNode*)malloc(sizeof(PolyNode));
    					q->coef = coef;
    					q->expn = expn;
    					q->next = p->next;
    					p->next = q;
    				}
    			}
    			else
    			{
    				p->next = (PolyNode*)malloc(sizeof(PolyNode));
    				p = p->next;
    				p->coef = coef;
    				p->expn = expn;
    				p->next = NULL;
    			}
    		}
    		else
    		{
    			head->next = (PolyNode*)malloc(sizeof(PolyNode));
    			head->next->coef = coef;
    			head->next->expn = expn;
    			head->next->next = NULL;
    		}
    	}
    	return head;
    }
    //多项式与指定单项式相乘,该单项式为 coefx^expn 
    Polynomial multiply(Polynomial poly, float coef, int expn)
    {
    	PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));
    	p = Poly;
    	q = poly->next;
    	while (q)
    	{
    		p->next = (PolyNode*)malloc(sizeof(PolyNode));
    		p = p->next;
    		p->coef = (q->coef*coef);
    		p->expn = (q->expn + expn);
    		q = q->next;
    	}
    	p->next = NULL;
    	return Poly;
    }
    void add(Polynomial poly1, Polynomial poly2)   //把 poly2 加到 poly1 上
    {
    	PolyNode *p, *q, *r;
    	r = poly1;
    	p = poly1->next;  //指向第一个节点
    	q = poly2->next;
    	poly2->next = NULL;
    	while (p && q)
    	{
    		if (p->expn > q->expn)
    		{
    			r->next = p;
    			p = p->next;
    			r = r->next;
    		}
    		else if (p->expn < q->expn)
    		{
    			r->next = q;
    			q = q->next;
    			r = r->next;
    		}
    		else
    		{
    			PolyNode *t;
    			p->coef += q->coef;
    			if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0
    			{
    				r->next = p;
    				r = r->next;
    				p = p->next;
    			}
    			else
    			{
    				t = p;
    				p = p->next;
    				free(t);
    			}
    			t = q;
    			q = q->next;
    			free(t);
    		}
    	}
    	if (p)
    		r->next = p;
    	if (q)
    		r->next = q;
    }
    //多项式减法 poly1-poly2形成一个新的多项式
    Polynomial polySubtract(Polynomial poly1, Polynomial poly2)
    {
    	//把poly2的系数取相反数。形成一个新的多项式
    	Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点
    	PolyNode *p, *q;
    	p = poly;
    	q = poly2->next;
    	while (q)
    	{
    		p->next = (PolyNode*)malloc(sizeof(PolyNode));
    		p = p->next;
    		p->coef = -(q->coef);  //系数取反
    		p->expn = q->expn;
    		q = q->next;
    	}
    	p->next = NULL;
    	add(poly, poly1);  //利用加法
    	return poly;
    }
    //多项式相加 poly1+poly2形成一个新的多项式 
    Polynomial polyAdd(Polynomial poly1, Polynomial poly2)
    {
    	Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点 
    	poly->next = NULL;
    	PolyNode *p, *q, *r;
    	r = poly;
    	p = poly1->next;
    	q = poly2->next;
    	while (p&&q)
    	{
    		if (p->expn > q->expn)
    		{
    			r->next = (PolyNode*)malloc(sizeof(PolyNode));
    			r = r->next;
    			r->coef = p->coef;
    			r->expn = p->expn;
    			p = p->next;
    		}
    		else if (p->expn < q->expn)
    		{
    			r->next = (PolyNode*)malloc(sizeof(PolyNode));
    			r = r->next;
    			r->coef = q->coef;
    			r->expn = q->expn;
    			q = q->next;
    		}
    		else
    		{
    			float m = p->coef + q->coef;
    			if (!(m > -0.000001 && m < 0.000001))
    			{
    				r->next = (PolyNode*)malloc(sizeof(PolyNode));
    				r = r->next;
    				r->coef = m;
    				r->expn = p->expn;
    			}
    			q = q->next;
    			p = p->next;
    		}
    	}
    	while (p)
    	{
    		r->next = (PolyNode*)malloc(sizeof(PolyNode));
    		r = r->next;
    		r->coef = p->coef;
    		r->expn = p->expn;
    		p = p->next;
    	}
    	while (q)
    	{
    		r->next = (PolyNode*)malloc(sizeof(PolyNode));
    		r = r->next;
    		r->coef = q->coef;
    		r->expn = q->expn;
    		q = q->next;
    	}
    	r->next = NULL;
    	return poly;
    }
    Polynomial polyMultiply(Polynomial poly1, Polynomial poly2)   //多项式相乘  
    {
    	Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点 
    	poly->next = NULL;
    	PolyNode *p;
    	p = poly2->next;
    	while (p)
    	{
    		add(poly, multiply(poly1, p->coef, p->expn));
    		p = p->next;
    	}
    	return poly;
    }
    void printPoly(Polynomial poly)    //打印多项式 
    {
    	if (poly && poly->next)
    	{
    		PolyNode *p = poly->next;  //p指向第一个节点
    		while (p->next)
    		{
    			printf("%gx^%d", p->coef, p->expn);
    			p = p->next;
    			if (p && (p->coef > 0))
    				printf("+");
    		}
    		if (p->expn == 0)
    			printf("%g", p->coef);   //打印常数项 
    		else
    			printf("%gx^%d", p->coef, p->expn);
    		printf("
    ");
    	}
    }
    void clear(Polynomial poly)   //释放内存
    {
    	if (poly && poly->next)
    	{
    		PolyNode *p, *q;
    		p = poly;
    		while (p)
    		{
    			q = p->next;
    			free(p);
    			p = q;
    		}
    	}
    	poly = NULL;
    }
    

    调用方法:

    int main()
    {
    	printf("用链表实现多项式的加减法
    ");
    	Polynomial poly1, poly2, poly;
    	printf("创建多项式一
    ");
    	poly1 = createPolynomial();
    	printf("多项式一:
    ");
    	printPoly(poly1);
    	printf("创建多项式二
    ");
    	poly2 = createPolynomial();
    	printf("多项式二:
    ");
    	printPoly(poly2);
    	printf("两多项式相加。和为:
    ");
    	poly = polyAdd(poly1, poly2);
    	printPoly(poly);
    	clear(poly);
    	printf("两个多项式相乘,积为:
    ");
    	poly = polyMultiply(poly1, poly2);
    	printPoly(poly);
    	clear(poly);
    	printf("两多项式相减。差为:
    ");
    	poly = polySubtract(poly1, poly2);
    	printPoly(poly);
    	clear(poly1);
    	clear(poly2);
    	clear(poly);
    	system("pause");
    	return 0;
    }

    调用中,调用次序是加法、乘法、减法,减法放最后。

    这是由于减法的过程中poly2会被破坏掉。细致看看add()方法就可明确。

    执行:



    代码比較长。逻辑有些复杂。得重复地看。


    完整代码下载:一元多项式的加法、减法、乘法


    若是有所帮助,顶一个哦!


    专栏完整文件夹:




  • 相关阅读:
    Python学习2——使用字符串(完整版)
    Python补充4——替换与修改
    Python学习3——列表和元组
    数据结构链表——双向链表
    数据结构链表—— 循环链表
    数据结构链表——静态链表
    LeetCode 61——旋转链表(JAVA)
    LeetCode 2——两数相加(JAVA)
    LeetCode 328——奇偶链表(JAVA)
    HillCrest Sensor HAL
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5120179.html
Copyright © 2011-2022 走看看