一、实验名称:多项式相加

二、实验学时: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. 数据结构实验:一元多项式计算器

    一.实验内容及要求 1.任务描述: 实验内容: 设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法.减法和乘法运算.其中多项式描述为: Am(x)=A0+A1x1+A2x ...

  2. 数据结构实验-稀疏一元多项式计算

    (实验)自行为稀疏一元多项式设计存储结构,并实现如下功能: ① 输入:从键盘输入多项式的各项系数和指数,创建一元多项式: ② 输出:按给定格式输出一元多项式:(例如:3*x20-x7+10) ③ 多项 ...

  3. 数据结构实验题——一元多项式计算

    一元多项式计算 程序所能达到的功能: 1.实现一元多项式的输入; 2.实现一元多项式的输出; 3.计算两个一元多项式的和并输出结果; 4.计算两个一元多项式的差并输出结果; 效果图 #include& ...

  4. 一元多项式的表示和相加【数据结构】

    一元多项式的表示和相加 运算只是一个定义,一切的一切,到最后都必须归咎于存储结构当中,实现物理存储,一元多项式包括数据对象数据关系以及数据之间的各种操作, 一元多项式的实现:用带表头结点的有序链表表示 ...

  5. 数据结构—— 一元多项式的运算(相加,相减,相乘)【C语言实现】

    用 C语言实现一元多项式的运算(相加,相减,相乘) 1.创建多项式时,无论指数项按什么顺序输入,输出均能实现以升幂顺序输出,且输入时有相同指数项时能够实现合并. 2.能够代入确切的X计算出最终多项式的 ...

  6. 【数据结构】一元多项式的表示及相加

    文章目录 ⭐️写在前面的话⭐️ 一元多项式的表示及相加 初始化 0_1.初始化链表 0_2_1.头插法插入多项式的项(没有相同项) 0_2_2.将要插入的相同,链表中有相同项,对应系数相加 0_3.从 ...

  7. 数据结构实验--双向链表及其应用

    数据结构实验一: 实验要求: 1.编写使用freelist的带头.尾节点的双向链表类的定义,实现双向链表的基本操作. 2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数 ...

  8. 实验三 一元多项式的加法

    数据结构实验报告 问题描述及分析 问题描述:实现一元多项式的加法. 要求:(1)编程实现一元多项式的加法. 编写一个测试主函数 分析:对于任意一元多项式 Pn(x)=p0+p1X^1+p2X^2+.. ...

  9. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  10. SDUT OJ 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

最新文章

  1. Devexpress XtraGrid 控件编辑的内容,如何实时生效
  2. 【Nginx】 server 配置记录
  3. 【干货】用户运营中的认知、考虑、行动模型
  4. 【宋红康程序思想学习日记3】杨辉三角
  5. 甘肃政法学院计算机科学与技术试题,甘肃政法学院计算机科学与技术专业课程教学大纲.doc...
  6. 2020年海南大学计算机调剂,2020年海南大学招收调剂生
  7. 使用RPM安装Mysql5.5找不到配置文件My.cnf
  8. MariaDB和MySQL性能测试比较
  9. iOS获取当前app的名称和版本号
  10. navicat工具能安装在linux,linux下安装navicat
  11. Pixel手机电信4G破解(含解锁BL和root)
  12. Transmission下载安装
  13. win10 桌面(Windows 资源管理器)卡死的根本解决办法
  14. Android Things:让你陌生的面包板
  15. linux ps-l命令详解,Linux系统中ps -l命令显示的英文含义
  16. 【渝粤题库】广东开放大学 工程经济 形成性考核
  17. git 中使用git add . 命令时候报如下警warning: LF will be replaced by CRLF in …….
  18. 大数据24小时:系统工程领域专家夏耘出任海云数据CEO,交通部将对网约车公司运营数据进行监管
  19. 运行jar包出现问题:java.lang.SecurityException: JCE cannot authenticate the provider BC
  20. c语言松树树干如何编程jemg,JE-C编程指南(上)

热门文章

  1. 新版白话空间统计(11):ArcGIS中的PZ值标尺
  2. Android APP开发入门教程
  3. 2020.2.22基于L大源码的Lede x86 软路由精简版固件
  4. KEPWARE通过MODBUS_TCP连接西门子PAC3200电能表
  5. C++ 回调函数 例子
  6. 解决kindle刷多看系统的问题
  7. 华为交换机基本配置命令明细
  8. php gd jpeg,怎么解决GD库不支持JPEG
  9. Centeros常用命令
  10. 光猫(吉比特h2-2)超级用户名与密码