MOOC 数据结构 | 2. 线性结构(4):应用实例:多项式加法运算

本文主要是介绍MOOC 数据结构 | 2. 线性结构(4):应用实例:多项式加法运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4. 多项式加法运算

主要思路:相同指数的项系数相加,其余部分进行拷贝。

4.1 多项式相加在计算机中的实现

上述多项式用单向链表表示:

(每个结点包含系数,指数和指向下一个结点的指针)

4.2 数据结构定义

struct PolyNode
{int coef; //系数int expon;//指数struct PolyNode *link; //指向下一个结点的指针
};
typedef struct PolyNode *Polynomial;
Polynomial P1,P2;

算法思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环:

  • P1->expon == P2->expon: 系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1和P2都分别指向下一项;
  • P1->expon > P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项;
  • P1->expon < P2->expon:将P2的当前项存入结果多项式,并使P2指向下一项;

当某一多项式处理完时,将另一个多项式的所有结点依次复制到结果多项式中去。

上述两个多项式相加的过程:

  1. 初始状态:P1和P2都指向第一个结点

         

   2. 比较第一个结点,P1的指数(5)大于P2的指数(4),P1的当前项拷贝到结果多项式中,P1往后挪:

         

  3. 比较P1的第二个结点和P2的第一个结点,指数相同,系数相加,然后将结果拷贝到结果多项式中,P1和P2都往后挪:

       

4. 指数相同,系数相加结果为0,不用拷贝,P1和P2同时往后挪:

      

5. P2指向的结点的指数较大,所以拷贝该项到结果多项式中,P2往后挪:

     

6. 指数相同,系数相加,结果拷贝到结果多项式中,P1和P2都往后挪:

    

7. 挪了之后P2就为空了,所以就把P1后面的所有结点接到结果多项式中:

   

4.3 代码实现

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:Attach(P2->coef, P2->expon, &rear);P2 = P2->link;break;case 0:sum = P1->coef + P2->coef;if(sum)  //系数相加结果不为0Attach(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;
}
//pRear其实是指针的指针,之所以这么做是因为C语言函数参数值传递
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值
}

示意图:

1、

2、来了个新结点P,要将其链接到*pRear后:

3、

4、

 

这篇关于MOOC 数据结构 | 2. 线性结构(4):应用实例:多项式加法运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036974

相关文章

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类