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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss