顺序表多项式相加

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 ai ai+1 … an …
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 x ai … an-1 an
插入前
插入后
顺序表中插入元素前后状态
(2)在表中删除第i个元素 算法实现的主要步骤是: 算法实现的主要步骤是: ① 判断删除位置的合理性。 判断删除位置的合理性。 从第i+1个元素开始, i+1个元素开始 ② 从第i+1个元素开始,依次向后 直到最后一个元素为止, 直到最后一个元素为止,将每个元 素向前移动一个位置。这时第i 素向前移动一个位置。这时第i个元 素已经被覆盖删除。 素已经被覆盖删除。 最后还要将线性表长度减一。 ③ 最后还要将线性表长度减一。
数据元素是组成数据的基本单位。 数据元素是组成数据的基本单位。数据元素是 一个数据整体中相对独立的单位。 一个数据整体中相对独立的单位 。 但它还可以分 割成若干个具有不同属性的项( 字段) , 故不是 割成若干个具有不同属性的项 ( 字段 ) 组成数据的最小单位
数据结构( 数据结构(data structure) )
2.2 线性数据结构
线性表是由有限个同类型的数据元素组 成的有序序列,一般记作(a 成的有序序列,一般记作(a1,a2,…,an)。 除了a 除了a1和an之外,任意元素ai都有一个直接 之外,任意元素a 前趋a 和一个直接后继a 前趋ai-1和一个直接后继ai+1。 a1无前趋,an 无前趋,a 无后继。 线性表的存储结构主要有顺序存储结构 和链式存储结构两种。
数据结构概念及顺序表
西安交通大学计教中心 ctec.xjtu.edu.cn
2.1 数据结构基本概念
1.数据(data) .数据( )
数据是指能够输入到计算机中, 数据是指能够输入到计算机中,并被计算机识 别和处理的符号的集合。 别和处理的符号的集合
2.数据元素(data element) .数据元素( )
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 ai ai+1 … an …
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 ai+1 … an
删除前
删除后
顺序表中删除元素前后状态
void SeqList::Delete( int i ) { if(i<1 || i>L->length ) cout<<"表中没有第 表中没有第"<<i<<"个元素 个元素"; 表中没有第 个元素 else { for ( int j=i; j<=length-1; j++ ) data[j-1] = data[j]; //元素依次向前ቤተ መጻሕፍቲ ባይዱ动 //元素依次向前移动 length--; } }
代表数组的某种类型。 (1)ElemType代表数组的某种类型。 ) 代表数组的某种类型 表示线性表当前长度, (2)length表示线性表当前长度,初始长度 ) 表示线性表当前长度 ),最大不超过 为0(空表),最大不超过 (空表),最大不超过maxsize。 。
顺序表的主要算法
个位置插入新元素x (1)在表中第 i 个位置插入新元素x 算法实现的主要步骤是: 算法实现的主要步骤是: 判断插入位置的合理性以及表是否已满。 ① 判断插入位置的合理性以及表是否已满。 从最后一个元素开始依次向前, ② 从最后一个元素开始依次向前,将每个 元素向后移动一个位置,直到第i 元素向后移动一个位置,直到第i个元素为 止。 向空出的第i个位置存入新元素x ③ 向空出的第i个位置存入新元素x。 ④ 最后还要将线性表长度加一。 最后还要将线性表长度加一。
数据结构基本类型
• 线性结构 —— 通迅录、成绩单、花名册 通迅录、成绩单、 • 树形结构 —— 电子字典、家谱、目录 电子字典、家谱、 • 图状结构 —— 交通线路、通信网络 交通线路、
数据结构中常用的存贮结构
(1) 顺序存贮
所有元素存放在一片连续的存贮单元中, 所有元素存放在一片连续的存贮单元中 , 逻辑上 相邻的元素存放到计算机内存仍然相邻。 相邻的元素存放到计算机内存仍然相邻。
是指相互之间存在一种或多种特定关系的 数据元素所组成的集合。 数据元素所组成的集合。数据结构包含三个方 面的内容,即数据的逻辑结构, 面的内容,即数据的逻辑结构,数据的存贮结 构和对数据所施加的运算。 构和对数据所施加的运算。
这三个方面的关系为:
• 数据的逻辑结构独立于计算机 , 是数据本身所固 数据的逻辑结构独立于计算机, 有的 • 存贮结构是逻辑结构在计算机存贮器中的映像 , 存贮结构是逻辑结构在计算机存贮器中的映像, 必须依赖于计算机。 必须依赖于计算机。 • 运算是指所施加的一组操作总称 。 运算的定义直 运算是指所施加的一组操作总称。 接依赖于逻辑结构, 接依赖于逻辑结构 , 但运算的实现必依赖于存贮 结构。 结构。
O(n2)
2. 空间复杂度 . 与时间复杂度类似, 与时间复杂度类似,空间复杂度是指算法 在计算机内执行时所占用的内存开销规模。但 在计算机内执行时所占用的内存开销规模。 我们一般所讨论的是除正常占用内存开销外的 辅助存储单元规模。 辅助存储单元规模。讨论方法与时间复杂度类 不再赘述。 似,不再赘述。
Loc(ai) = Loc(a1) + (i-1) * d
length=n maxsize
a1 a2
0 1

ai-1 ai ai+1 … an
i-2 i-1 i n-1
顺序表类描述
const int MAXSIZE=100; //顺序表最大允许长度 顺序表最大允许长度 class SeqList { public: ElemType data[MAXSIZE]; // 存储数据的数组 int length; // 顺序表当前长度 SeqList() { length=0; } //构造函数 构造函数 void ClearList() { length=0; } //将顺序表置为空表 将顺序表置为空表 //判断顺序表是否为空表 判断顺序表是否为空表 bool IsListEmpty() {return length==0;} ( 下页 下页continue …. )
(2) 链式存贮
所有元素存放在可以不连续的存贮单元中, 所有元素存放在可以不连续的存贮单元中 , 元素 之间的关系通过地址确定, 之间的关系通过地址确定 , 逻辑上相邻的元素存 放到计算机内存后不一定是相邻的。 放到计算机内存后不一定是相邻的。
(3) 索引存贮(略) 索引存贮( (4) 散列存贮(略) 散列存贮(
(3)在表中查找某个元素
下面是根据数据元素本身的值进行查询的 算法, 为需要查找的元素 为需要查找的元素, 算法 , x为需要查找的元素 , 算法返回元素的 实际位置。 实际位置。
int SeqList::Find(ElemType x ) { for( int i = 0; i<length; i++ ) { //查找成功,返回元素位置 查找成功, 查找成功 if( data[i]==x ) return i+1; } return 0; //查找失败,返回 0 查找失败, 查找失败 }
顺序表应用举例
【例2-1】利用顺序表表示多项式,实现两个一 】利用顺序表表示多项式, 元多项式L 相加, 元多项式 1(x)和L2(x)相加,将结果存于多项式 和 相加 L3(x)中。并计算当 1(x)=3.5+4x2+2.5x4, 中 并计算当L L2(x)=1.5x+2.6x2+1.6x3时,L3(x)的结果是什么。 的结果是什么。 的结果是什么 一元多项式P(x)可以表示为 0, 0), (a1, 1), … , 可以表示为((a 一元多项式 可以表示为 (a n, n))。例如线性表 。例如线性表((6, 1), (-5, 4), (8, 10))表示 表示 多项式: 多项式 P(x) = 6x - 5x4 + 8x10。
用顺序表L1和 存放需要相加的两个多项式 存放需要相加的两个多项式L 用顺序表 和L2存放需要相加的两个多项式 1(x) 来存放结果。 和 L2(x),用顺序表 来存放结果 。 多项式相加算 ,用顺序表L3来存放结果 法可按照下列步骤实现: 法可按照下列步骤实现: ① 设定两个位置变量i和j指向顺序表 和L2的第一 设定两个位置变量 和 指向顺序表L1和 的第一 指向顺序表 个元素,设定位置变量k表示 的插入位置,插入 个元素,设定位置变量 表示L3的插入位置, 表示 的插入位置 位置从1开始 本例中i、 和 初值均为 开始。 初值均为1。 位置从 开始。本例中 、j和k初值均为 。 比较i和 两个位置数据元素的指数项 如果L1中 两个位置数据元素的指数项, ② 比较 和 j两个位置数据元素的指数项,如果 中 项指数较小, 第i项指数较小,则将此项数据元素复制到 的位 项指数较小 则将此项数据元素复制到L3的位 后移; 中第j项 置 k中 , 并将位置变量 和 k后移 ; 如果 中第 项 中 并将位置变量i和 后移 如果L2中第 指数较小,则同样是将此项复制到L3中 指数较小 , 则同样是将此项复制到 中 , 并将位 置变量j和 后移 如果两项指数项相等, 后移; 置变量 和 k后移 ; 如果两项指数项相等 , 则 合并 同类项后再将结果复制到 后再将结果复制到L3中 并将位置变量i、 同类项后再将结果复制到 中,并将位置变量 、j 同时后移。 和k同时后移。 同时后移 中的一个顺序表已经处理完毕, ③ 当L1或L2中的一个顺序表已经处理完毕,则将另 或 中的一个顺序表已经处理完毕 一个顺序表的剩余部分复制到L3中 剩余部分复制到 一个顺序表的剩余部分复制到 中。
void SeqList::ListInsert( int i, ElemType x ) { if( i<1 || i>length+1 || length==MAXSIZE ) cout<<"插入位置错误或表满 插入位置错误或表满"; 插入位置错误或表满 else { for( int j=length-1;j>=i-1;j-- ) { data[j+1] = data[j]; // 元素依次向后移动 } data[i-1] = x; // 向第i个位置存入新元素 向第 个位置存入新元素 length++; // 表长度加 表长度加1 } }
算法分析
1. 时间复杂度 . 一个算法花费的时间与算法中语句的执行次 数成正比,哪个算法中语句执行次数多,它花费 数成正比,哪个算法中语句执行次数多, 时间就多。 时间就多。 数据结构中数据元素个数n称为问题的规模 称为问题的规模, 数据结构中数据元素个数 称为问题的规模, 不断变化时, 当n不断变化时,语句的执行次数也会变化。一 不断变化时 语句的执行次数也会变化。 个算法中的时间复杂度一般用语句执行次数的数 量级来衡量。 量级来衡量。 例如: 例如: for(i=1; i<=n; i++) for(j =1; j<=i; j++) d[i][j]=data[i][j]+1;
( 接上页 )
//判断顺序表是否为满 判断顺序表是否为满 bool IsListFull() {return length==MAXSIZE;} //在表中删除第 个元素 在表中删除第i个元素 在表中删除第 void ListDelete( int i ); //在表中第 i 个位置插入新元素 在表中第 个位置插入新元素x void ListInsert( int i, ElemType x ); int Find( ElemType x ); //在表中查找元素 在表中查找元素 };
算法( 算法(algorithm) )
通俗地讲,算法就是一种解题的方法。更严格地说, 通俗地讲,算法就是一种解题的方法。更严格地说, 算法是由若干条指令组成的有穷序列, 算法是由若干条指令组成的有穷序列,它必须满足下述 条件(也称为算法的五大特性) 条件(也称为算法的五大特性): 个或多个输入的外界量( ( 1) 输入 : 具有 个或多个输入的外界量 ( 算法开始前 ) 输入: 具有0个或多个输入的外界量 的初始量) 的初始量) (2)输出:至少产生一个输出,它们是算法执行完后的 )输出:至少产生一个输出, 结果。 结果。 (3)有穷性:每条指令的执行次数必须是有限的。 )有穷性:每条指令的执行次数必须是有限的。 (4)确定性:每条指令的含义都必须明确,无二义性。 )确定性:每条指令的含义都必须明确,无二义性。 (5)可行性:每条指令的执行时间都是有限的。 )可行性:每条指令的执行时间都是有限的。
顺序表
采用顺序存储结构的线性表称为顺序表, 采用顺序存储结构的线性表称为顺序表,它的数 据元素按照逻辑顺序依次存放在一组连续的存储单 元中。逻辑上相邻的数据元素, 元中。逻辑上相邻的数据元素,其存储位置也彼此 相邻。 相邻。 假定元素a 的物理地址是Loc(a 每个元素占d 假定元素 1的物理地址是Loc(a1),每个元素占 个存储单元,则第i个元素的存储位置为 个元素的存储位置为: 个存储单元,则第 个元素的存储位置为
相关文档
最新文档