线性表(linear list)
表格
n个数据元素的有限序列。
- 数据元素类型不局限于数字。如:字母表
- 一个数据元素可以由若干项(item)组成。此时,将数据元素称为记录(record),含大量记录的线性表称为文件(file)。
- 同一线性表的元素具有相同特性。序偶性。
将线性表记为(a1,a2,......,ak,......an)
- 其中n(n>=0)定义为线性表的程度,当n=0时,称为空表。
- 在非空表中,每个元素都有特定的位置,称为位序。
- 线性表长度可变,可以进行访问、插入、删除等操作。
基本操作:
- InitList(&L) //构造一个空的线性表
- DestoryList(&L) //销毁线性表
- clearList(&L) //将线性表重置为空表
- ListEmpty(L) //判断线性表是否为空
- ListLength(L) //求线性表长度
- GetElem(L,i,&e) //返回线性表中第i个位置的元素
- LocateElem(L,e,compare()) //返回线性表中元素值为e的元素的位置
- PriorElem(L,cur_e,&pre_e) //求一个元素的前驱元素
- NextElem(L,cur_e,&next_e) //求一个元素的后继元素
- ListInsert(&L,i,e) //插入一个元素
- ListDelete(&L,i,&e) //删除一个元素
- ListTraverse(L,visit()) //遍历线性表
其余操作:
- 合并线性表LA和LB(LA和LB可能是乱序排列,也可能是升序排列,也可能是降序排列)
→合并为线性表LA
→合并为线性表LB
→包含重复元素
→不包含重复元素
→乱序排列
→升序排列
→降序排列
线性表的顺序表示和链式表示
- 线性表的顺序表示
用一组连续的存储单元依次存储线性表的数据元素。
当线性表的逻辑结构相同,线性表的存储结构可以不同。
存储位置关系:
Loc(ai+1)=Loc(ai)+len;
Loc(ai+1)=Loc(a1)+len*(i-1);
Loc(a1)称为线性表的起始地址,线性表的基地址。
顺序结构、顺序映像(sequential mapping)、顺序表
特点:
(1)以物理位置关系来表示逻辑关系,逻辑相邻,物理相邻。
(2)只要确定了起始位置,就可以随机存取线性表中元素。
数组也具有随机存取的特性,常用数组来描述顺序结构。线性表长度可变,所以用动态分配的一维数组表示。
C语言中,数组的下标从0开始。
缺点:
插入和删除时,需要大量移动元素。
三个重要属性:
基地址、线性表长度、一个存储空间长度。
typedef struct{
ElemType *elem; //存储空间基地址
int length; //顺序表长度
int listSize; //sizeof(ElemType)
}sqList;
基本操作:
- InitList_sq(sqList&L) //初始化顺序表
- DestoryList(sqList&L) //销毁线性表
- clearList_sq(sqList&L) //将线性表重置为空表
- ListEmpty_sq(sqList L) //判断线性表是否为空
- GetElem_sq(sqListL,int i,ElemType &e) //返回线性表中第i个位置的元素
- LocateElem_sq(sqList L,ElemType e,compare(ElemType,ElemType)) //返回线性表中元素值为e的元素的位置
- ListInsert_sq(&L,i,e) //插入一个元素
- ListDelete(sqList &L,int i,ElemType &e) //删除一个元素
其他操作:
- 合并顺序表LA和LB(LA和LB可能是乱序排列,也可能是升序排列,也可能是降序排列)
→合并为线性表LA
→合并为线性表LB
→包含重复元素
→不包含重复元素
→乱序排列
→升序排列
→降序排列
求时间复杂度
- 线性表的链式表示
- 单链表
- 静态链表
- 循环链表(circular linked list)
- 双向链表(double linked list)