数据结构 实验1——一元多项式的表示与相加
一、实验名称:多项式相加
二、实验学时:4学时
三、实验目的
1.理解单链表的结构特性和基本操作算法;
2.掌握利用单链表实现两个多项式相加算法。
四、实验内容(步骤)
1.创建两个一元多项式;
2.输出一元多项式;
3.实现两个一元多项式相加;
4.输出相加后的一元多项式。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据一元多项式相加的运算规则有:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复制到“和多项式”中。“和多项式”链表中的结点无须另外生成,可以从两个多项式的链表中摘取。
算法思路:假设指针 p 和 q 分别指向多项式 P 和 Q 中当前进行比较的某个结点,则比较两个结点中的指数项有3种情况:一是指针 p 所指结点的指数值 < 指针 q 所指结点的指数值,则应该摘取 p 所指结点插入到“多项式”链表中;二是指针 p 所指结点的指数值 > 指针 q 所指结点的指数值,则应该摘取 q 所指结点插入到“多项式”链表中;三是指针 p 所指结点的指数值 = 指针 q 所指结点的指数值,则将两个结点的系数相加,若和数不为零,则修改 p 所指结点的系数值,同时释放 q 所指结点,反之从多项式 P 的链表中删除相应结点,并释放 p 和 q 所指结点。
实验源代码
#include<iostream>
#include<stdlib.h>
#define flag -1 // 定义数据输入结束的标志数据
using namespace std;//typedef int DataType;
typedef struct
{float coef; // 多项式系数 int expn; // 指数
}DataType; // DataType 相当于 struct typedef struct Node
{DataType data;struct Node *next;
}LNode,*LinkList;void CreateLinkList_tail(LinkList L) // 尾插法
{LNode *s,*r; // s为指向当前插入元素的指针,r为尾指针。DataType x;r=L;cin>>x.coef>>x.expn; // 分别输入多项式的系数、指数while(x.coef!=flag) // 当该结点中系数为 -1 时,输入结束。{s=(LinkList)malloc(sizeof(LNode)); // 为当前插入元素的指针分配地址空间 s->data=x;r->next=s;r=s;cin>>x.coef>>x.expn;}r->next=NULL;
}LinkList Add_L(LinkList P,LinkList Q) // 两个多项式相加
{LNode *p,*q; // p 和 q 分别指向多项式 P 和 Q 中当前进行比较的某个结点LNode *r,*s; // r 指向和多项式链表的尾指针,s 指向待释放指针。float sum; // sum 记录相同指数结点的系数和p=P->next; // p 一开始指向第一个元素的结点(非头结点)q=Q->next; // q 一开始指向第一个元素的结点(非头结点)r=P; // r 初始指向 P 多项式链表,并始终指向和多项式尾结点while(p&&q){ if((p->data).expn < (q->data).expn){// 第1种情况:p 所指结点的指数值小于 q 所指结点的指数值// 此时 P 链表结点插入到和多项式尾部,且 r 指针后移r->next=p;r=r->next;p=p->next; }else if((p->data).expn > (q->data).expn){// 第2种情况:p 所指结点的指数值大于 q 所指结点的指数值// 此时 Q 链表结点插入到和多项式尾部,且 r 指针后移r->next=q;r=r->next;q=q->next;}else{// 第3种情况中又分为2种情况sum=(p->data).coef+(q->data).coef; // 求出指数值相同的两个结点对应的系数之和if(sum!=0){// 1)系数之和不为0时// 系数和重新赋值给 p 并插入和多项式尾部,释放 q 所指结点,另将 q 后移(p->data).coef=sum;r->next=p;r=r->next;p=p->next;s=q;q=q->next;free(s); }else{// 2)系数之和为0时// 无须插入结点到和多项式尾部,释放 p、q 所指结点,另将 p、q 后移s=p;p=p->next;free(s);s=q;q=q->next;free(s); }}}if(p) // 若链表 P 还有待处理的结点,链接 P 链表中剩下结点r->next=p;else // 否则,链接 Q 链表中剩下结点r->next=q;free(Q); // 释放 Q 的头结点return P; // 返回和多项式头链表
}void printlinklist(LinkList L) // 输出链表
{LNode *p;p=L->next; // p指向第一个元素的结点(非头结点)while(p){cout<<p->data.coef<<"*x^"<<p->data.expn;p=p->next; // p指向下一个结点if(p && p->data.coef>0) // 若当前结点不为空且系数大于0,则在该数之前添加一个“+”号cout<<"+";}cout<<endl;
}int main()
{LinkList L,Q,P; // 等价于 LNode *L,*Q,*P; L=(LinkList)malloc(sizeof(LNode));L->next=NULL; // 建立空链表 LQ=(LinkList)malloc(sizeof(LNode));Q->next=NULL; // 建立空链表 QCreateLinkList_tail(L); // 创建第1个多项式 Lcout<<"第1个多项式:"; printlinklist(L); // 输出第1个多项式 LCreateLinkList_tail(Q); // 创建第2个多项式 Qcout<<"第2个多项式:";printlinklist(Q); // 输出第2个多项式 QP=Add_L(L,Q); // P为和多项式,将多项式 L 与多项式 Q 相加后的和多项式赋给 Pcout<<"两个多项式相加:"; printlinklist(P); // 输出和多项式 Preturn 0;
}
运行结果
数据结构 实验1——一元多项式的表示与相加相关推荐
- 数据结构实验:一元多项式计算器
一.实验内容及要求 1.任务描述: 实验内容: 设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法.减法和乘法运算.其中多项式描述为: Am(x)=A0+A1x1+A2x ...
- 数据结构实验-稀疏一元多项式计算
(实验)自行为稀疏一元多项式设计存储结构,并实现如下功能: ① 输入:从键盘输入多项式的各项系数和指数,创建一元多项式: ② 输出:按给定格式输出一元多项式:(例如:3*x20-x7+10) ③ 多项 ...
- 数据结构实验题——一元多项式计算
一元多项式计算 程序所能达到的功能: 1.实现一元多项式的输入; 2.实现一元多项式的输出; 3.计算两个一元多项式的和并输出结果; 4.计算两个一元多项式的差并输出结果; 效果图 #include& ...
- 一元多项式的表示和相加【数据结构】
一元多项式的表示和相加 运算只是一个定义,一切的一切,到最后都必须归咎于存储结构当中,实现物理存储,一元多项式包括数据对象数据关系以及数据之间的各种操作, 一元多项式的实现:用带表头结点的有序链表表示 ...
- 数据结构—— 一元多项式的运算(相加,相减,相乘)【C语言实现】
用 C语言实现一元多项式的运算(相加,相减,相乘) 1.创建多项式时,无论指数项按什么顺序输入,输出均能实现以升幂顺序输出,且输入时有相同指数项时能够实现合并. 2.能够代入确切的X计算出最终多项式的 ...
- 【数据结构】一元多项式的表示及相加
文章目录 ⭐️写在前面的话⭐️ 一元多项式的表示及相加 初始化 0_1.初始化链表 0_2_1.头插法插入多项式的项(没有相同项) 0_2_2.将要插入的相同,链表中有相同项,对应系数相加 0_3.从 ...
- 数据结构实验--双向链表及其应用
数据结构实验一: 实验要求: 1.编写使用freelist的带头.尾节点的双向链表类的定义,实现双向链表的基本操作. 2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数 ...
- 实验三 一元多项式的加法
数据结构实验报告 问题描述及分析 问题描述:实现一元多项式的加法. 要求:(1)编程实现一元多项式的加法. 编写一个测试主函数 分析:对于任意一元多项式 Pn(x)=p0+p1X^1+p2X^2+.. ...
- 数据结构实验之链表五:单链表的拆分-sdut
数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...
- SDUT OJ 数据结构实验之排序一:一趟快排
数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
最新文章
- Devexpress XtraGrid 控件编辑的内容,如何实时生效
- 【Nginx】 server 配置记录
- 【干货】用户运营中的认知、考虑、行动模型
- 【宋红康程序思想学习日记3】杨辉三角
- 甘肃政法学院计算机科学与技术试题,甘肃政法学院计算机科学与技术专业课程教学大纲.doc...
- 2020年海南大学计算机调剂,2020年海南大学招收调剂生
- 使用RPM安装Mysql5.5找不到配置文件My.cnf
- MariaDB和MySQL性能测试比较
- iOS获取当前app的名称和版本号
- navicat工具能安装在linux,linux下安装navicat
- Pixel手机电信4G破解(含解锁BL和root)
- Transmission下载安装
- win10 桌面(Windows 资源管理器)卡死的根本解决办法
- Android Things:让你陌生的面包板
- linux ps-l命令详解,Linux系统中ps -l命令显示的英文含义
- 【渝粤题库】广东开放大学 工程经济 形成性考核
- git 中使用git add . 命令时候报如下警warning: LF will be replaced by CRLF in …….
- 大数据24小时:系统工程领域专家夏耘出任海云数据CEO,交通部将对网约车公司运营数据进行监管
- 运行jar包出现问题:java.lang.SecurityException: JCE cannot authenticate the provider BC
- c语言松树树干如何编程jemg,JE-C编程指南(上)