线性表是由 n ( n ≥0)个相同类型的数据元素组成的有限序列,其元素可以是一个数、一个符号,也可以是由多个数据项组成的复合形式。其中数据元素的个数 n 定义为线性表的长度。当 n =0时线性表为空表,记为( )或Φ。
常常将非空的线性表( n >0)记作( a 1 , a 2 ,…, a n ),这里的数据元素 a i (1≤ i ≤ n )只是一个抽象的符号,其具体含义在不同的情况下可以不同。
例如,由26个英文字母组成的字母表
(A, B, C, … , Z)
就是一个线性表,表中的每个数据元素均是一个大写字母。
再如,软件2001班、软件2002班、软件2003班、……、软件2010班的班级人数
(44, 45, 46,...,45)
也是一个线性表,表中的每个数据元素均是正整数。这两个线性表都是包含简单数据元素的例子。
设序列中第 i ( i 表示逻辑位序)个元素为 a i (1≤ i ≤ n ),则线性表的一般表示为
( a 1 , a 2 ,…, a i , a i +1 ,..., a n )
其中, a 1 为第一个元素,又称作表头元素; a 2 为第二个元素; a n 为最后一个元素,又称作表尾元素。
一个线性表可以用一个标识符来命名,如用 L 命名上面的线性表,则
L = ( a 1 , a 2 ,…, a i , a i +1 ,..., a n )
线性表中的元素在位置上是有序的,即第 i 个元素 a i 处在第 i −1个元素 a i −1 的后面和第 i +1个元素 a i +1 的前面,这种位置上的有序性就是一种线性关系,所以线性表是一个线性结构,用二元组表示为
L = ( D , R )
其中,
D = { a i |1≤ i ≤ n , n ≥0, a i 为ElemType类型},ElemType是自定义的类型标识符。
R = { r }, r = {< a i , a i +1 >|1≤ i ≤ n −1}。
线性表是一种相当灵活的数据结构,它的长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,也可以进行插入和删除操作等。
抽象数据类型线性表的定义如下:
ADT List{ 数据对象:D={ai|1≤i≤n,n≥0, ai为ElemType类型} 数据关系:R={<ai, ai+1>| ai,ai+1∈D,i=1,…,n−1} 基本操作: //初始化线性表,构造一个空的线性表L InitList(&L) //销毁一个已存在的线性表,释放线性表L占用的内存空间 DestroyList(&L) //判断线性表是否为空,若L为空表,则返回真值,否则返回false ListEmpty(L) //求线性表长度,返回线性表中元素的个数 ListLength(L) //输出线性表,当线性表L不为空时,依次输出线性表中各元素 DispList(L) //获取线性表中某位置元素,获取线性表L中位置i的元素,用e返回该元素 GetElem(L,i,&e) //按元素查找,返回线性表中第一个等于e的元素的位置,不存在则返回0 LocateElem(L,e) //插入元素,在线性表L位置i处插入一个元素,该元素值等于e ListInsert(&L,i,e) //删除元素,将线性表L位置i处的元素删除,并用e将该元素返回 ListDelete(&L,i,&e) }
对于上面定义的抽象数据类型线性表,还可以进行一些更复杂的操作,例如,将两个或两个以上的线性表合并成一个线性表,把一个线性表分拆成两个或两个以上的线性表等。
一个线性表 L =('a', 'f ', 'e', 'd'),求ListLength(L)、ListEmpty(L)、GetElem(L,2,e)、LocateElem(L,'a')、ListInsert(L,4,'e')和ListDelete(L,3)等基本运算的执行结果。
各种基本运算结果如下:
ListLength(L) = 4; ListEmpty(L); //返回false(0) GetElem(L,2,e),e = 'f'; LocateElem(L,'a') = 1; ListInsert(L,4,'e'); //执行后线性表L = ('a', 'b', 'f', 'e', 'e', 'd') ListDelete(L,3); //执行后线性表L = ('a', 'f', 'e', 'd')