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

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部