本次笔记内容:
2.4 多项式的加减运算实现
P24 1.题意理解与多项式表示
P25 2.程序框架及读入多项式
P26 3.加法、乘法运算及多项式输出

文章目录

  • 多项式加法运算
    • 采用不带头结点的单项链表实现
      • 算法思路
      • 算法实现
  • 设计函数求两个一元多项式的乘积与和
    • 输入样例
    • 求解思路
    • 多项式表示
    • 程序框架搭建
    • 如何读入多项式
    • 如何实现两多项式相乘
    • 多项式输出

多项式加法运算

采用不带头结点的单项链表实现

  • 采用不带头结点的单向链表,按照指数递减的顺序排列各项。

如图三个每个结点中有三个参数:系数、指数、下一结点的指针。

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->exponexpon:将P2的当前项存入结果多项式,并使P2指向下一项;
  • 当某一项多项式处理完时,将另一项多项式的所有结点依此复制到结果多项式中去。
算法实现
Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{Polynomial front, rear, temp;int sum;rear = (Polynomial)malloc(sizeof(struct PolyNode));front = rear;while (P1 && P2){switch (Compare(P1->expon, P2->expon)){case 1:Attach(P1->coef, P1->expon, &rear);// Attach()将系数、指数形成新的项,拷贝到rear的后面P1 = P1->link;break;case -1:Attach(P2->coef, P2->expon, &rear);P2 = P2->link;case 0:sum = P1->coef + P2->coef;if (sum)Attach(sum, P1->expon, &rear);P1 = P1->link;P2 = P2->link;break;}for (; P1; P1 = P1->link)Attach(P1->coef, P2->expon, &rear);for (; P2; P2 = P2->link)Attach(P2->coef, P2->expon, &rear);rear->link = NULL;temp = front; // 把空节点赋给temp,front后移,空节点temp释放掉front = front->link;free(temp);return front;}
}

其中,对Attach()的定义为

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;
}

设计函数求两个一元多项式的乘积与和

输入样例

4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
第一行,代表第一个多项式有4项,系数指数分别为(,),(,),(,),(,)。

求解思路

  1. 多项式的表示
  2. 程序框架
  3. 读多项式
  4. 加法实现
  5. 乘法实现
  6. 多项式输出

多项式表示

  1. 用数组表示:编程简单、调试容易,但是需要事先确定数组大小;
  2. 用链表表示:动态性强,变成略微复杂、调试比较困难。

一种比较好的方式是动态数组。但是本次实现还是采用链表。

程序框架搭建

int main()
{读入多项式1读入多项式2乘法运算并输出加法运算并输出return 0;
}

需要设计的函数:

  • 读一个多项式
  • 量多项式相乘
  • 两多项式相加
  • 多项式输出
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()
{......scanf("%d", &N);......while(N--){scanf("%d %d", &c, &e);Attach(c, e, &Rear);}......return P;
}

注意将Rear传入Attach()中时,应该采用传址调用。Rear初值设为NULL的话,Attach中要增加关于Rear的判断环节,不妥。因此令Rear指向一个空结点。

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;
}

如何实现两多项式相乘

  1. 将乘法运算转换为加法运算
  • 将P1当前项(ci,ei)乘P2多项式,再加到结果多项式里
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;
}
  1. 逐项插入
  • 将P1当前项(c1_i,e1_i)乘P2当前项(c2_i,e2_i),并插入到结果多项式中,关键是要找到插入位置。
  • 初始结果多项式可由P1第一项乘P2获得(如上)
  • 逐项插入的实现框架如下
Polynomial Mult(Polynomial P1, Polynomial P2){......t1=P1;t2=P2;......while (t2)  /* 先用P1的第1项乘以P2,得到P */{......}t1 = t1->link;while (t1){t2 = P2;Rear=P;while(t2){e=t1->expon+t2->expon;c=t1->coef*t2->coef;......t2=t2->link;}t1=t1->link;}......
}

具体实现如下

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) /* 先用P1的第1项乘以P2,得到P */{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{ // 如果系数相加等于0,删去这个结点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);
}

多项式输出

实际上是一个链表的遍历问题,链表遍历的基本框架如下

void PrintPoly(Polynomial P){while(P){P = P->link;}
}

具体实现如下

void PrintPoly(Polynomial P)
{int flag = 0; // 辅助调整输出格式用if (!P){printf("0 0\n");return;}while (P){if (!flag)flag = 1;elseprintf(" ");printf("%d %d", P->coef, P->expon);P = P->link;}
}

flag作用为,如果是第一个输出的多项式的项,则前面不需要置空格。

【数据结构笔记07】不带头结点链表实现多项式相加、相乘相关推荐

  1. 链表应用 多项式相加

     用链表实现多项式相加 #include<iostream> #include<cstdio> #include<malloc.h> #define flag -1 ...

  2. #数据结构:编写不带头结点单链表的建立、插入和删除算法

    编写不带头结点单链表的建立.插入和删除操作算法. 一.问题描述 编写一个不带头节点的单链表 二.基本要求 1) 建立 2) 插入 3) 删除 三.算法思想 选用不带头结点的单链表,在第一个元素节点前插 ...

  3. 数据结构-线性表之带头结点的双向循环链表

    文章目录 前言 实现 (1)结构定义 (2)基本函数 (3)操作实现 测试 代码 前言 链表的类型有很多种(根据带头或不带头,循环或非循环等等),但是我们重点研究的只有两种,一种结构非常简单是无头单向 ...

  4. 不带头结点链表,尾部插入法创建

    /*创建一个链表,尾结点插入法*/ #include<stdio.h> #include<stdlib.h> #define DataType char/*节点类型*/ typ ...

  5. 【数据结构】-链栈(带头结点)

    链栈-带头结点 1.头文件及类型定义 2.链栈类型定义 3.函数声明 4.基本操作 4.1 初始化链栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main函数 5.小结 ...

  6. 数据结构C语言描述——用单链表实现多项式的相加

    #include <stdio.h> #include <stdlib.h>typedef DataType; typedef struct Node2{DataType xi ...

  7. 链表应用——多项式相加

    f(X)=1+x+x2+x5 g(X)=x3+x6+x8+x100 f(X)+g(X)=1+x+x2+x3+x5+x6+x8+x100 两个有序多项式相加合并问题: 显然第一个想到的是用数组解决,可仔 ...

  8. 【数据结构】单向不带头结点 非循环链表的 增,删,查,改 的实现

    #include <iostream>using namespace std;int main() {/*结点一般是在堆上申请空间的,申请的空间的地址在堆区上是"随机分配&quo ...

  9. 数据结构笔记(四)-- 静态链表实现

    静态链表 一.静态链表定义 用数组来描述的链表 二.静态链表存储数据类型定义 typedef int ElemType;//定义存储数据 静态链表结点结构 数据域:用于存储数据元素的值: 游标:其实就 ...

最新文章

  1. java rectangle 类_Java编写的Rectangle类
  2. Ubuntu18.04+CUDA10.2 深度学习开发环境配置指南
  3. MQ 的本质是什么呢?
  4. WordPress主题 WebStack导航主题
  5. VSS(Visual SourceSafe) 代码管理器 使用技巧---快速登录
  6. 通信(1)----Http协议的方法讲解
  7. 【2016北京集训测试赛(七)】自动机 (思考题)
  8. 调用vba_VBA代码解决方案的第86讲内容:VBA代码的优化篇
  9. Python requests抓取有道翻译 最新版破解js加密
  10. 【学习笔记】MATLAB与数学建模——蒙特卡罗模拟仿真
  11. Python 函数参数引用(传值传址)
  12. git查看历史记录及修改内容
  13. html网页文字链接的若干问题
  14. C语言—班级学生管理系统
  15. linux下rename用法--批量重命名
  16. 软件设计师---UML
  17. python 模拟微信浏览器请求_用chrome在电脑上模拟微信内置浏览器
  18. 终端安全-准入控制AAA认证
  19. qt程序在Linux下字体乱了,QT5程序字体渲染的问题
  20. 建造者模式Builder——读书笔记

热门文章

  1. 【Oracle】审计
  2. 异常检测: 多元高斯分布
  3. 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  4. R+markdown+LaTeX 中文编译解决方案
  5. 解决Ubuntu下软件包依赖关系的若干方法
  6. 在Java中安全地将long转换为int
  7. 如何为项目中的单个文件禁用ARC?
  8. passwd: 鉴定令牌操作错误_user 及passwd 设置
  9. 以下不是python内置函数的是_为什么说python内置函数并不是万能的?
  10. STM32:GPIO配置说明