数据结构(严蔚敏)【一元多项式的运算】【C语言】

1、一元多项式的运算:实现两个多项式加、减乘运算

设计内容:

用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为:用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法;

设计思路:

将顺序表数组下标作为多项式的指数项,数组内的数据元素存放多项式的系数,通过访问数组内元素的同时获取下标并对二者进行不同的运算后,将运算结果依旧按原形式放入新的数组中,完成对两个多项式的加减乘运算。

测试数据:

多项式1: 10 + 5 x − 4 x 2 + 3 x 3 + 2 x 4 10 + 5x -4x^2 + 3x^3 + 2x^4 10+5x4x2+3x3+2x4(即输入10 0 5 1 -4 2 3 3 2 4)(输入-1 -1结束)

多项式2: − 3 + 8 x + 4 x 2 − 5 x 4 + 7 x 5 − 2 x 6 -3 + 8x + 4x^2 - 5x^4 + 7x^5 -2x^6 3+8x+4x25x4+7x52x6(即输入 -3 0 8 1 4 2 -5 4 7 5 -2 6)(输入 -1 -1结束)

代码实现:

1、构造一个空的线性表L
void InitList(SqList *L) {/**申请连续的MAXSIZE长度空间*/L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);/**判断空间是否申请成功*/if (!L->data)exit(-1);for (int i = 0; i < MAXSIZE; i++)L->data[i] = 0;/**空表最高次项为0*/L->highPower = 0;
}
2、销毁线性表L
  • 释放data指向的空间
  • 让L -> data指向null
  • 让L- > highPower =0
void DestroyList(SqList *L) {/**释放data指向的空间*/free(L->data);L->data = NULL;L->highPower = 0;
}
3、两多项式相加
/**两多项式相加*/
void TwoPolynomialAdd(SqList L1, SqList L2, SqList *L3) {/**获取两多项式的最大项以确定相加后的多项式的最大项*/L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;/**通过循环将两个多项式的同指数项的系数相加并保存到新的多项式中*/for (int i = 0; i <= L3->highPower; i++)L3->data[i] = L1.data[i] + L2.data[i];
}
4、两多项式相减
/**两多项式相减*/
void TwoPolynomialSub(SqList L1, SqList L2, SqList *L3) {/**获取两多项式的最大项以确定相加后的多项式的最大项*/L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;/**通过循环将两个多项式的同指数项的系数相减并保存到新的多项式中*/for (int i = 0; i <= L3->highPower; i++)L3->data[i] = L1.data[i] - L2.data[i];
}
5、两多项式相乘
/**两多项式相乘*/
void TwoPolynomialMul(SqList L1, SqList L2, SqList *L3) {/**两多项式的最高项相加为新多项式的最高项*/L3->highPower = L1.highPower + L2.highPower;for (int i = 0; i <= L1.highPower; i++)/**通过双层循环将两个多项式的每一项两两相乘与并保存到新的多项式中*/for (int j = 0; j <= L2.highPower; j++)/**相乘后的指数项为两项指数项相加*/L3->data[i + j] += L1.data[i] * L2.data[j];
}
6、完整代码实现
#include <stdio.h>
#include <stdlib.h>/**表可能达到的最大长度,存储空间初始分配量*/
#define MAXSIZE 20/**表的数据类型,根据实际情况而定*/
typedef int ElemType;typedef struct {/**数组存储数据元素,最大值为MAXSIZE*/ElemType *data;/**最高次项*/int highPower;
} SqList;/**构造一个空的线性表L*/
void InitList(SqList *L) {/**申请连续的MAXSIZE长度空间*/L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);/**判断空间是否申请成功*/if (!L->data)exit(-1);for (int i = 0; i < MAXSIZE; i++)L->data[i] = 0;/**空表最高次项为0*/L->highPower = 0;
}/**销毁线性表L*/
void DestroyList(SqList *L) {/**释放data指向的空间*/free(L->data);L->data = NULL;L->highPower = 0;
}/**创建多项式:由用户输入多项式的每项系数与指数*/
void CreatePolynomial(SqList *L) {int coefficient, exponent;/**循环输入常数项的每一项*/for (int i = 0; i < 10; i++){printf("\n请输入第%d项的常数项和指数项,结束请输入-1 -1:", i + 1);scanf("%d%d", &coefficient, &exponent);/**指数为-1则结束输入*/if (exponent != -1) {/**数组下标为指数项,常数项存入下标对应的位置,若有相同指数项则常数项相加*/L->data[exponent] += coefficient;/**指数项最大项为多项式长度*/if (L->highPower < exponent) L->highPower = exponent;} elsebreak;}printf("输入完毕\n");
}/**输出常数项:按多项式指数大小依次输出多项式每一项*/
void PrintPolynomial(SqList L) {printf("多项式为:");/**若常数项为0则不输出,若不为0则只输出常数项*/if (L.data[0] != 0)printf("%d", L.data[0]);/**若常数项为0则不输出*/if (L.data[1] > 0)printf("+%dx", L.data[1]);/**不输出指数项为1*/else if (L.data[1] < 0)printf("%dx", L.data[1]);/**从第二项开始输出指数项*/for (int i = 2; i <= L.highPower; i++)/**若常数项为0则不输出该项*/if (L.data[i] > 0)printf("+%dx^%d", L.data[i], i);else if (L.data[i] < 0)printf("%dx^%d", L.data[i], i);printf("\n");
}/**两多项式相加*/
void TwoPolynomialAdd(SqList L1, SqList L2, SqList *L3) {/**获取两多项式的最大项以确定相加后的多项式的最大项*/L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;/**通过循环将两个多项式的同指数项的系数相加并保存到新的多项式中*/for (int i = 0; i <= L3->highPower; i++)L3->data[i] = L1.data[i] + L2.data[i];
}/**两多项式相减*/
void TwoPolynomialSub(SqList L1, SqList L2, SqList *L3) {/**获取两多项式的最大项以确定相加后的多项式的最大项*/L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;/**通过循环将两个多项式的同指数项的系数相减并保存到新的多项式中*/for (int i = 0; i <= L3->highPower; i++)L3->data[i] = L1.data[i] - L2.data[i];
}/**两多项式相乘*/
void TwoPolynomialMul(SqList L1, SqList L2, SqList *L3) {/**两多项式的最高项相加为新多项式的最高项*/L3->highPower = L1.highPower + L2.highPower;for (int i = 0; i <= L1.highPower; i++)/**通过双层循环将两个多项式的每一项两两相乘与并保存到新的多项式中*/for (int j = 0; j <= L2.highPower; j++)/**相乘后的指数项为两项指数项相加*/L3->data[i + j] += L1.data[i] * L2.data[j];
}int Menu() {int a;printf("输入1创建两个多项式\t\t输入2输出两个多项式\n");printf("输入3将两个多项式相加 \t\t输入4将两个多项式相减\n");printf("输入5将两个多项式相乘 \t\t输入0退出\n");printf("请输入:");scanf("%d", &a);return a;
}int main() {SqList L1, L2, L3;InitList(&L1);InitList(&L2);InitList(&L3);while (1) {switch (Menu()) {case 1:printf("\n请输入多项式 1 :");CreatePolynomial(&L1);printf("\n多项式 1 为:\n");PrintPolynomial(L1);printf("\n请输入多项式 2 :");CreatePolynomial(&L2);printf("\n多项式 2 为:\n");PrintPolynomial(L2);break;case 2:printf("\n多项式 1 为:\n");PrintPolynomial(L1);printf("\n多项式 2 为:\n");PrintPolynomial(L2);break;case 3:InitList(&L3);TwoPolynomialAdd(L1, L2, &L3);printf("两多项式相加后的结果");PrintPolynomial(L3);break;case 4:TwoPolynomialSub(L1, L2, &L3);printf("两多项式相减后的结果");PrintPolynomial(L3);break;case 5:DestroyList(&L3);InitList(&L3);TwoPolynomialMul(L1, L2, &L3);printf("两多项式相乘后的结果");PrintPolynomial(L3);break;case 0:exit(0);default:printf("暂无此功能\n");}}
}

运行结果:

image-20221001100254659

image-20221001100418985

相加后的多项式为: 7 + 13 x + 3 x 3 − 3 x 4 + 7 x 5 − 2 x 6 7+13x+3x^3-3x^4+7x^5-2x^6 7+13x+3x33x4+7x52x6

相减后的多项式为: 13 − 3 x − 8 x 2 + 3 x 3 + 7 x 4 − 7 x 5 + 2 x 6 13-3x-8x^2+3x^3+7x^4-7x^5+2x^6 133x8x2+3x3+7x47x5+2x6

相乘后的多项式为:- 30 + 65 x + 92 x 2 − 21 x 3 − 48 x 4 + 73 x 5 + 43 x 6 − 53 x 7 + 19 x 8 + 8 x 9 − 4 x 1 0 30+65x+92x^2-21x^3-48x^4+73x^5+43x^6-53x^7+19x^8+8x^9-4x^10 30+65x+92x221x348x4+73x5+43x653x7+19x8+8x94x10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143289.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175)

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09; 文章目录 算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录1. MT2151 权值计算2. MT2152 黑客小码哥3. MT2153 来给…

Linux基础之LVM卷管理

LVM LVM是 Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小&#xff0c;以分配合适的硬盘空间。普通的…

linux lvcreate,LFCS:如何使用vgcreate,lvcreate和lvextend命令管理和创建LVM - 第11部分...

因为在LFCS考试要求有效的二月变化 2&#xff0c;2016年 &#xff0c;我们增加了必要的专题到LFCS系列发表在这里。 为了准备这场考试&#xff0c;你是高度鼓励使用联邦经济竞争法系列为好。 LFCS&#xff1a;管理LVM和创建LVM分区 - 第11部分 安装Linux系统时最重要的决定之一…

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

lvcreate 常用命令举例

http://linux.cn/article-5117-1.html4 个 lvcreate 常用命令举例 2015-3-25 15:09| 查看: 2752| 评论: 3| 收藏: 3| 分享: 10 原文&#xff1a;http://www.ehowstuff.com/4-lvcreate-command-examples-on-linux/作者&#xff1a; skytech译文&#xff1a;LCTT https://linux.…

49.逻辑卷管理4,逻辑卷管理详解,lvscan,lvcreate,lvdisplay,lvextend,lvreduce,lvremove,lvresize,lvchange

逻辑卷相关操作 可以把逻辑卷想象成分区&#xff0c;那么这个逻辑卷当然也需要被格式化和挂载。另外&#xff0c;逻辑卷也是可以动态调整大小的&#xff0c;而且数据不会丟失&#xff0c;也不用卸载逻辑卷。 常用的命令有 lvscan Lvcreate Lvdisplay lvextend lvreduce Lvremov…

oppo手机删除计算机怎样恢复,【数据恢复篇】oppo手机删掉的照片怎么恢复

原标题&#xff1a;【数据恢复篇】oppo手机删掉的照片怎么恢复 手机删掉的照片可以恢复吗&#xff1f;oppo手机删掉的照片怎么恢复&#xff1f;很多人会奇怪oppo手机删掉的照片还能恢复吗&#xff1f;现在科技技术的提高&#xff0c;照片能够被恢复也是很简单的。像我们所知道的…

苹果手机照片误删恢复的方法

苹果手机照片误删恢复的方法&#xff1f;苹果手机相册里都有一个【最近删除】相册&#xff0c;为了恢复我们手机里误删的照片&#xff0c;我们首先可以打开相册&#xff0c;然后找里面的最近删除的相簿&#xff0c;看看里面有没有自己误删的照片&#xff0c;如果有的话&#xf…

android sd卡数据恢复软件下载,手机SD卡内存卡数据恢复软件

手机SD卡内存卡数据恢复软件免费版是一款专门解决内存卡等存储介质数据丢失问题的恢复软件&#xff0c;支持各个型号的SD卡、内存卡及U盘的删除恢复、格式化恢复等。 手机SD卡内存卡数据恢复软件是一款简单易用功能强大的数据恢复软件。该软件有针对性的对各类内存卡进行数据恢…

android 恢复照片误删,安卓手机数据恢复:红米手机照片误删怎么恢复

原标题&#xff1a;安卓手机数据恢复&#xff1a;红米手机照片误删怎么恢复 红米手机误删照片怎么恢复&#xff1f;小编的也爷爷使用的是红米手机&#xff0c;有一天跟我说“他误删了手机上的很多张照片&#xff0c;还一直抱怨自己眼花乱删东西”。小编就赶紧安慰爷爷还说会帮他…

android删除sd卡照片恢复,安卓手机照片误删怎么恢复

现如今国内大多的人都拥有一部智能手机&#xff0c;使用手机拍摄照片记录生活中的美好也成为了一种普遍流行的行为。当我们用手机照片记录身边点滴后&#xff0c;经过时间的打磨&#xff0c;我们也需要整理这些照片&#xff0c;误删照片随之成为一个严峻的问题&#xff0c;手机…

android删除手机照片恢复软件,安卓手机上照片删除如何恢复?

原标题&#xff1a;安卓手机上照片删除如何恢复&#xff1f; 安卓手机上的照片被删除了如何恢复&#xff1f;现在大部分手机都有手机最近删除相册&#xff0c;当发现手机上的数据被自己误删的时候&#xff0c;可以在手机最近删除相册中快速恢复。不过呢&#xff0c;最近删除的相…

android系统手机能看到照片,安卓怎么恢复手机照片?原来可以这样做

安卓怎么恢复手机照片&#xff1f;原来可以这样做~其实照片在我们生活工作中扮演者重要的色&#xff0c;对很多人来说一张照片不仅仅是一份回忆&#xff0c;更是感情沟通的桥梁&#xff0c;误删了手机里重要的照片怎么找回来呢&#xff1f;手机照片恢复管家免费教你哦~ 一、安卓…

android 恢复照片误删,安卓手机照片误删怎么恢复?一般人不知道这个恢复方法...

安卓手机照片误删怎么恢复&#xff1f;一般人不知道这个恢复方法 2019年06月12日 17:40作者&#xff1a;黄页编辑&#xff1a;黄页 分享 安卓手机照片误删怎么恢复?一般人不知道这个恢复方法。手机可以说取得相当大的成功了&#xff0c;在近些年来&#xff0c;手机相机慢慢“霸…

android手机照片恢复,安卓手机照片怎么恢复?简单恢复方法分享

安卓手机照片怎么恢复?手机作为中国微信用户强大的社交工具&#xff0c;可以说手机相机已成为人们生活的重要部分&#xff0c;不小心误删手机相册照片或者微信等图片&#xff0c;我们在使用手机过程中是不可避免的&#xff0c;别担心&#xff0c;小编有办法恢复的&#xff0c;…

手机回收站的照片超过30天删除了怎么恢复

苹果手机有一个功能是&#xff0c;照片删除后的30天内还可以从最近删除里还原&#xff0c;但是&#xff0c;手机回收站的照片超过30天删除了怎么恢复&#xff1f;依靠苹果公司给到的衍生软件好像是做不到的了&#xff0c;小编却有一个办法&#xff01;有一款超好用的数据恢复软…

android mac 照片恢复,如何恢复照片?这样做,手机照片直接恢复!

如何恢复照片?现在人们都喜欢用照片记录每时每刻&#xff0c;所以大家手机里往往都存满了照片。但是存储在手机上的照片如果被误删的时候应该怎么样去恢复呢?今天小编给大家介绍几个手机照片恢复的方法&#xff0c;希望可以解决你的烦恼~ 方法一&#xff1a;从最近删除恢复 在…

android mac 照片恢复,相片恢复?误删的手机照片简单的找回方法来了!

相片恢复&#xff1f;误删的手机照片简单的找回方法来了&#xff01; 2020年07月29日 11:29作者&#xff1a;网络编辑&#xff1a;宏伟 分享 相片恢复&#xff1f;误删的手机照片简单的找回方法来了&#xff01;我们手机中存了很多的手机照片&#xff0c;由于很多我们经常会清理…

android 读取手机存储数据恢复,Android智能手机数据恢复方法浅析

曾琪 罗慧瑜 摘要:根据数据丢失的原因,Android智能手机数据恢复方法分为两大类:物理恢复和软件恢复。物理恢复一般是由于手机进水、摔坏等无法开机情况下的芯片级恢复,而软件恢复则大多因为逻辑损坏。该文针对Android智能手机数据在物理或者逻辑情况下造成的数据丢失问题,…

android删除sd卡照片恢复,手机内存清理方法及照片误删恢复方法 手机党必备

原标题&#xff1a;手机内存清理方法及照片误删恢复方法 手机党必备 手机用的时间久了肯定都会出现一个问题&#xff0c;那就是出现卡顿&#xff0c;数据内存紧张。其实也怪不得别人&#xff0c;有的人手机256G的存储空间都能被用完&#xff0c;占用最多的还是那日益增加的自拍…