数据结构 C++版 杨秀金 第2章 线性表-2新.pptVIP

  • 3
  • 0
  • 约8.47千字
  • 约 34页
  • 2015-12-24 发布于广东
  • 举报

数据结构 C++版 杨秀金 第2章 线性表-2新.ppt

数据结构 第2章 线性表 第2讲 第2章 线性表 线性结构是最简单、最基本的数据结构,本章讨论线性表的基本概念、存储结构以及相关运算。 主要内容: ? 线性表的基本概念 ? 线性表的顺序存储结构及实现 ? 线性表的链表存储结构及实现 ? 线性表的应用 本章分为(4~5)讲 第1讲 2.1 线性表的基本概念 2.2 线性表的顺序存储结构及实现(2.2.1~2.2.3) 2.2.4 线性表的其他运算 除前面两种基本运算外,还有一些较复杂的运算。 class SqList {   //……代码与前文类Sqlist的定义完全同前; public: //以下是增加的两个公有函数成员 void Insertdz( ElemType x); //有序表插入 void Deletaz(ElemType x); //有序表删除 }; 1.在非递减有序表中插入一个数据元素x,使线性表仍保持非递减有序。    前提是线性表中数据元素已经有序。已知条件是将要插入的数据x,插入的位置需要程序来查找。 已知有线性表:(14,21,21,38,46,80) 若x=30,结果:(14,21,21,30,38,46,80) 若x=10,结果:(10,14,21,21,38,46,80) 若x=99,结果:(14,21,21,38,46,80,99)    因插入的数据元素x值不同其插入位置也不同。插入位置怎样确定? 1.在非递减有序表中插入一个数据元素x,使线性表仍保持非递减有序。 算法2.3 void SqList::Insertdz( ElemType x) { int i=length-1; while(i=0 elem[i]x) { elem[i+1]=elem[i]; i--;} elem[i+1]=x; //插入数据元素 length++; //表度长加1 };    算法从表尾元素开始与x比较,当elem[i]x且未到表头元素时继续循环。一边比较一边向后移动数据元素。 算法的主要考虑数据元素的移动,时间复杂度为O(n)。 若采用从表头元素开始与x比较的方法,其效率如何? 2.在非递减有序表中删除所有值为x的元素。 已知条件是某数据元素x的值。以elem[i]与x是否相等为判断条件来查找删除的位置,然后删除所有值为x的元素。 算法2.4 void SqList::Deletaz(ElemType x) { int i=0,j; //查找第一个x值出现的位置 while(ilength elem[i]x) i++; if (i==length) cout \n x no!endl; else{ while(elem[i]==x) //进行删除 { for( j=i; jlength-1; j++) elem[j]=elem[j+1]; length--; //表长减1 } } } 删除非递减有序表中所有值为x的元素,算法分析 本算法含有两个并列的循环结构,由于影响时间效率的主要因素是大量数据元素的移动,因此前面关于下标i的循环忽略不计。 else中是一个二重循环,如果忽略x重复出现的次数,主要依据是移动数据元素的for循环,经估算元素的平均移动次为(n?1)/2,因此算法的时间复杂度是O(n)。 综上所述,线性表采用顺序存储结构在插入、删除时,需大量移动数据元素,效率较低。由于是静态存储结构,需预先定义大小确定的数组,容量有限。 2.3 线性表的链表存储结构及实现    采用顺序存储结构的线性表,在频繁进行插入、删除操作时会大量移动数据元素,效率较低。同时,顺序存储必须占用一批地址连续的存储空间,存储分配只能预先进行。但是,它适于直接(随机)存取操作。    本节将讨论线性表的另一种存储结构—链表存储结构,由于它不要求逻辑上相邻的数据元素在物理位置上也一定相邻,因此,它没有顺序存储结构所具有的弱点。 2.3.1 单链表与指针    对于程序设计基础较好的读者,可以越过本节直接学习2.3.2节。

文档评论(0)

1亿VIP精品文档

相关文档