题目描述

编写一元多项式加法运算程序。要求用线性链表存储一元多项式(参照课本)。

输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc(提示:调用CreatePolyn(polynomial &P,int m)。输入格式要求如下所示:

1

多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)

多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)

多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)

0 ---操作终止,退出。

输出:显示三个输入多项式Pa、Pb、Pc、和多项式Pa+Pb、多项式Pa+Pb+Pc(提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))。

多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>。零多项式的输出格式为<0,0>。

解题思路

该题用链表来储存多项式的项,首先要弄清表达形式:

这里使用系数、指数的形式来连续储存,并且构造出题目要求的函数实现的功能。

typedef struct TERM* ptr;
struct TERM {int Coefficient;int Exponent;ptr Next;
};
typedef ptr Polynomial;void CreatePolyn(Polynomial P, int m);
Polynomial AddPolyn(Polynomial Pa, Polynomial Pb);
void PrintPolyn(Polynomial P);

下一步是构造多项式(CreatePolyn()):

m表示多项式项数,表示多项式头结点为空(第一项为下一项)。本题多项式都是按照指数递增的形式,所以不用调序。

void CreatePolyn(Polynomial P, int m)
{ptr cur = P->Next = (ptr)malloc(sizeof(struct TERM));for (int n = 0; n < m; n++){int coef, comp;cin >> coef >> comp;cur->Coefficient = coef;cur->Exponent = comp;if (n == m - 1)cur->Next = NULL;else{cur->Next = (ptr)malloc(sizeof(struct TERM));cur = cur->Next;}}return;
}

然后输出函数(PrintPolyn()):

这其中主要的问题是0多项式,也就是表示为<0,0>时的特判;由于我在处理中,为方便后续的结点输出,是系数为零即删除。这就需要讨论只有头结点的多项式仍有一个输出<0,0>.这里用了flag来记录是否有项输出。

void PrintPolyn(Polynomial P)
{ptr cur = P->Next;int flag = 0;while (cur != NULL) {cout << '<' << cur->Coefficient << ',' << cur->Exponent << '>';if (cur->Next != NULL) {cout << ',';}cur = cur->Next;flag = 1;}if (!flag) {cout << '<' << '0' << ',' << '0' << '>';}cout << endl;return;
}

题目主要部分是多项式相加。考虑两种方式:

(1)一种是将其中一个加到另一个上,然后输出被加的这个;

(2)将结果生成为一个新的多项式。

第二种方式的遍历顺序和易错点比较少,也不需考虑一些阴间的情况,首先选择第二种。

然而,我首次采用的方式就是第一种,debug时还以为实现是错误的,而且代码也长得相当难看,最后结构比较混乱,还有goto语句。(看得出伤痕累累、受尽折磨…)这种方法实际上需要讨论指数大小的情况,类似于模拟一个人计算的过程,要先模拟对齐(which也是最折磨的)。我是将A作为被加的。大体思路是:

i、首先检测B是否为空,不然不用加了;

ii、检测A为空,这样的话需要把B复制到A,输出A;

iii、在循环中开始相加:如果A的指数小,那么需要在A中增加新的结点并赋值该B结点的值,反之一直寻找A指数更大的结点;

iv、相加时系数为0要删除,但是,删除后需要注意就只有B需要后移一位来进行下一轮;

v、在iii中需要注意的点是可能会遇到还未达到指数相等就结束的情况,这其中只有在A的系数小于B的系数的时候还需要做收尾工作(如果B结束就不加到A上了,没影响):在结束的A的尾部还需要将B的剩余部分复制。

在代码实现时,我将ii中和v中的B到A的复制操作合并了,所以出现了一个goto语句。

void AddPolyn(Polynomial Pa, Polynomial Pb)
{ptr ptra = Pa, ptrb = Pb;if (ptrb->Next == NULL)return;if (ptra->Next == NULL)goto CopyPbToPa;while (1) {if (ptrb->Next->Exponent < ptra->Next->Exponent) {while (ptrb->Next != NULL && ptrb->Next->Exponent < ptra->Next->Exponent) {ptr cur = (ptr)malloc(sizeof(struct TERM));cur->Next = ptra->Next;ptra->Next = cur;ptra = cur;cur->Exponent = ptrb->Next->Exponent;cur->Coefficient = ptrb->Next->Coefficient;ptrb = ptrb->Next;}if (ptrb->Next == NULL) {break;}continue;}else if (ptrb->Next->Exponent > ptra->Next->Exponent) {while (ptra->Next != NULL && ptra->Next->Exponent < ptrb->Next->Exponent)ptra = ptra->Next;if (ptra->Next == NULL) {break;}continue;}ptra->Next->Coefficient += ptrb->Next->Coefficient;int flag = 0;if (ptra->Next != NULL && ptra->Next->Coefficient == 0) {ptr tmp = ptra->Next;ptra->Next = ptra->Next->Next;free(tmp);flag = 1;}if (flag) {ptrb = ptrb->Next;}else {ptra = ptra->Next;ptrb = ptrb->Next;}if (ptra->Next == NULL || NULL == ptrb->Next)break;}CopyPbToPa:while (ptrb->Next != NULL) {ptr cur = (ptr)malloc(sizeof(struct TERM));cur->Next = NULL;ptra->Next = cur;ptra = cur;cur->Exponent = ptrb->Next->Exponent;cur->Coefficient = ptrb->Next->Coefficient;ptrb->Next = ptrb->Next->Next;}return;
}

贴源代码

还是应当给出相对好理解和使用的生成新的多项式的一种,这其中就是两列多项式同时移动,相同才相加,不相同就不加选指数小的;同时也有关于尾部结束的处理问题,但简单,也就是把没加完的加到新多项式(newpoly)

#include <iostream>
using namespace std;typedef struct TERM* ptr;
struct TERM {int Coefficient;int Exponent;ptr Next;
};
typedef ptr Polynomial;void CreatePolyn(Polynomial P, int m);
Polynomial AddPolyn(Polynomial Pa, Polynomial Pb);
void PrintPolyn(Polynomial P);
int main() {int status = 0;Polynomial Pa = (ptr)malloc(sizeof(struct TERM)), Pb = (ptr)malloc(sizeof(struct TERM)), Pc = (ptr)malloc(sizeof(struct TERM));cin >> status;if (status) {int m;cin >> m;CreatePolyn(Pa, m);cin >> m;CreatePolyn(Pb, m);cin >> m;CreatePolyn(Pc, m);PrintPolyn(Pa);PrintPolyn(Pb);PrintPolyn(Pc);Polynomial ab = AddPolyn(Pa, Pb);PrintPolyn(ab);Polynomial abc = AddPolyn(ab, Pc);PrintPolyn(abc);}return 0;
}void CreatePolyn(Polynomial P, int m)
{ptr cur = P->Next = (ptr)malloc(sizeof(struct TERM));for (int n = 0; n < m; n++){int coef, comp;cin >> coef >> comp;cur->Coefficient = coef;cur->Exponent = comp;if (n == m - 1)cur->Next = NULL;else{cur->Next = (ptr)malloc(sizeof(struct TERM));cur = cur->Next;}}return;
}Polynomial AddPolyn(Polynomial Pa, Polynomial Pb) {ptr pa = Pa->Next, pb = Pb->Next, newpoly = (ptr)malloc(sizeof(struct TERM)), pre = newpoly, cur = NULL;while (pa != NULL && pb != NULL) {cur = (ptr)malloc(sizeof(struct TERM));//新和结点if (pa->Exponent == pb->Exponent) {if (0 == pa->Coefficient + pb->Coefficient) {pa = pa->Next;pb = pb->Next;pre->Next = NULL;free(cur);continue;}cur->Coefficient = pa->Coefficient + pb->Coefficient;cur->Exponent = pa->Exponent;pa = pa->Next;pb = pb->Next;}//可加时else {ptr tmp = pa->Exponent < pb->Exponent ? pa : pb;cur->Coefficient = tmp->Coefficient;cur->Exponent = tmp->Exponent;if (tmp == pa) pa = pa->Next;else pb = pb->Next;}//连接链表pre->Next = cur;cur->Next = NULL;pre = cur;}while (NULL != pa) {cur = (ptr)malloc(sizeof(struct TERM));cur->Coefficient = pa->Coefficient;cur->Exponent = pa->Exponent;pa = pa->Next;pre->Next = cur;cur->Next = NULL;pre = cur;}while (NULL != pb) {cur = (ptr)malloc(sizeof(struct TERM));cur->Coefficient = pb->Coefficient;cur->Exponent = pb->Exponent;pb = pb->Next;pre->Next = cur;cur->Next = NULL;pre = cur;}return newpoly;
}void PrintPolyn(Polynomial P)
{ptr cur = P->Next;int flag = 0;while (cur != NULL) {cout << '<' << cur->Coefficient << ',' << cur->Exponent << '>';if (cur->Next != NULL) {cout << ',';}cur = cur->Next;flag = 1;}if (!flag) {cout << '<' << '0' << ',' << '0' << '>';}cout << endl;return;
}

——2022.10.10

3.3.Polynomial_add 一元多项式相加相关推荐

  1. c语言一元多项式相加

    用单链表实现一元多项式相加 #include<stdio.h> #include<stdlib.h> typedef struct Node{float coef;//系数 i ...

  2. 基于C++的一元多项式相加

    资源下载地址:https://download.csdn.net/download/sheziqiong/85996014 资源下载地址:https://download.csdn.net/downl ...

  3. 数据结构——有序链表的合并,链表实现一元多项式相加

    1.有序链表的合并 void Connect(LinkList a, LinkList b, LinkList& c) {LNode* pa, * pb, * pc;//三个结点指针pa = ...

  4. C语言实现一元多项式相加

    C语言 链表实现一元多项式相加 这里的代码复制后,可以直接运行,按照规定的输入即可得出多项式的结果. 问题描述 设计一种单链表存储结构,每个节点成员有一个系数和一个指数,以及下一个节点的指针,数据类型 ...

  5. C语言一元多项式相加(链表)

    今天写一个关于一元多项式相加的程序,就当是在练习运用一下链表的知识.首先,我们先来分析一波,一元多项式相加,首先要用链表创建两个或多个多项式,每个节点里的数据有两个,系数和指数:其次,如果要实现乱幂输 ...

  6. 一元多项式c语言顺序存储,一元多项式相加程序(C语言)

    /* 2007-3-22 一元多项式的加法 */ # include # include # include typedef struct  PolyNode { int  coef; int  ex ...

  7. 编写一个程序实现两个一元多项式相加的运算。

    [问题描述]编写一个程序实现两个一元多项式相加的运算. [输入形式]从标准输入中读入四行数据, 其中第一行和第三行:各是是一个整数,表示第二行和第四行数据的个数: 第二行和第四行是若干个以空格分隔的整 ...

  8. 数据结构 - 一元多项式相加减(C语言)

    通常情况下,一元多项式可写成: an(x) = a1x^e1 + a2x^e2 + a3x^e3 + ... + amx^em (数字,m为下标),其中:pi是指数为ei的项的非零系数,0<= ...

  9. 严蔚敏数据结构:链表实现一元多项式相加

    一.基本概念 1.多项式pn(x)可表示成:  pn(x)=a0+a1x+a2x2+-+anxn. listP={(a0,e0),(a1,e1),(a2,e2),-,(an,en) }.在这种线性表描 ...

最新文章

  1. 【pytorch】nn.conv2d的使用
  2. 996.icu 不加班的程序员有前途吗?
  3. 全面梳理关系型数据库和 NoSQL 的使用情景
  4. 关于在linux python源文件头部添加 “#!/usr/bin/env python” 不能直接运行的问题
  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
  6. 满足 Google Play 目标 API 等级 (targetSdkLevel) 的要求
  7. 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树
  8. 格雷码问题:输出当输入为n时的格雷码
  9. java集合数组,数组小到大排序,数组大到小排序
  10. 最详细的YOLOv3论文笔记
  11. mac idea命令精简使用版常用指令
  12. Typore快速插入图片
  13. # 研究杂感 × VOSviewer(第三辑)
  14. 博士申请 | 香港理工大学李青教授团队招收机器学习全奖博士/研究助理
  15. linux检测扩容卡,怎么检测SD卡是否被扩容过?对SD卡进行扩容检测的方法
  16. Android监听蓝牙与设备连接状态、关闭和打开状态
  17. 计算机睡眠之后无法唤醒,电脑进入睡眠状态后无法唤醒一直黑屏,该如何处理...
  18. Python实例1—打印购物小票
  19. 二、CString、CStringA 和 CStringW
  20. Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7...

热门文章

  1. 小米及其他Android手机无法连接mac解决方案
  2. 微信小程序数据绑定与模板语法
  3. 牛批了第一次见到这么清晰的微服务概述,助你轻松入门到进阶
  4. V4L2+QT视频优化策略
  5. Q1营收净利双双超预期 为何转型中的陆金所驱动力不足?
  6. halcon介绍以及与opencv比较
  7. 引入antd组件样式,按需引入的高级配置
  8. xp计算机怎么共享网络,windows XP下如何实现共享上网的方法
  9. 基于逻辑回归的新闻数据集分类
  10. 使用继电器和Arduino开发板控制高压电路