数据结构 第2章_线性表(g)
线性表的定义 线性表:简称表,是n(n≥0)个具有相同类型的数据元素的有限序列。 线性表的长度:线性表中数据元素的个数。 空表:长度等于零的线性表,记为:L=( )。 非空表记为:L=(a1, a2 , …, ai-1, ai , …, an) 线性表的图形表示 线性表的特性 线性表的抽象数据类型定义 线性表的抽象数据类型定义 线性表的抽象数据类型定义 线性表的抽象数据类型定义 Insert( ) 前置条件:表已存在 输入:插入i;待插x 功能:在表的第i个位置处插入一个新元素x 输出:若插入不成功,抛出异常 后置条件:若插入成功,表中增加一个新元素 Delete( ) 前置条件:表已存在 输入:删除位置i 功能:删除表中的第i个元素 输出:若删除成功,返回被删元素,否则抛出异常 后置条件:若删除成功,表中减少一个元素 线性表的抽象数据类型定义 Empty( ) 前置条件:表已存在 输入:无 功能:判断表是否为空 输出:若是空表,返回1,否则返回0 后置条件:表不变 ADT const int MaxSize=100; template class T //模板类 class SeqList { public: SeqList( ) ; //构造函数 SeqList(T a[ ], int n); ~SeqList( ) ; //析构函数 int Length( ); T Get(int i); int Locate(T x ); void Insert(int i, T x); T Delete(int i); private: T data[MaxSize]; int length; }; 顺序表的实现——无参构造函数 操作接口:SeqList( ) 顺序表的实现——有参构造函数 操作接口:SeqList(T a[ ], int n) 顺序表的实现——有参构造函数 template class T SeqList::SeqList(T a[ ], int n) { if (nMaxSize) throw 参数非法; for (i=0; in; i+ +) data[i]=a[i]; length=n; } 顺序表的实现——插入 操作接口: void Insert(int i, T x) 插入前:(a1, … , ai-1, ai, … , an) 插入后:(a1, … , ai-1, x , ai, … , an) 顺序表的实现——插入 例:(35,12,24,42),在i=2的位置上插入33。 算法描述——伪代码 1. 如果表满了,则抛出上溢异常; 2. 如果元素的插入位置不合理,则抛出位置异常; 3. 将最后一个元素至第i个元素分别向后移动一个位置; 4. 将元素x填入位置i处; 5. 表长加1; 顺序表的实现——插入 template class T void SeqList::Insert(int i, T x) { if (length=MaxSize) throw 上溢; if (i1 | | ilength+1) throw “位置异常; for (j=length; j=i; j-- ) data[j]=data[j-1] ; data[i-1]=x; length++ ; } 顺序表的实现——插入 最好情况( i=n+1): 基本语句执行0次,时间复杂度为O(1)。 最坏情况( i=1): 基本语句执行n+1次,时间复杂度为O(n)。 平均情况(1≤i≤n+1): 时间复杂度为O(n)。 操作接口: T Delete(int i) 删除前:(a1, …, ai-1,ai,ai+1,…,an) 删除后:(a1,…,ai-1,ai+1, …,an) 例:(35, 33, 12, 24, 42),删除i=2的数据元素。 ⑴若线性表需频繁查找却很少进行插入和删除操作,宜采用顺序表作为存储结构;若线性表需频繁插入和删除时,则宜采用单链表做存储结构。 ⑵当线性表中元素个数变化较大或者未知时,最好使用单链表实现;而如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。 启
原创力文档

文档评论(0)