线性表
线性表定义
线性表(Linear List) : 由n个具有相同特性的数据元素(结点)a1, a2,…组成的有限序列。
- 其中数据元素的个数n定义为表的长度。
- 当n=0时称为空表将非空的线性表(n>0)记作: (a1, a2, …an)
线性表特性
线性表的逻辑特征是:
- 在非空的线性表, 有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;
- 有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋an-1;
- 其余的内部结点都有且仅有一个直接前趋ai-1.和一个直接后继ai+1。
- 元素个数有限。
- 线性表是一种逻辑结构,表示元素之间一对一相邻的关系。1233
- 线形表顺序存储结构占用一片连续的存储空间。知道某个元素的存储位置就可以计算其他元素的存储位置。
线性表的顺序表示
线性表的基本操作(抽象数据类型定义)
-
InitList(&L)
//初始化操作,建立一个空的线性表L -
DestertList(&L)
//销毁已存在的线性表L -
ClearList(&L)
//将线性表清空 -
ListInsert(&L, i, e)
//在线性表L中第i个位置插入新元素e -
ListDelete(&L i, &e)
//删除线性表L中第i个位置元素,用e返回 -
lsEmpty(L)
//若线性表为空,返回true,否则false -
ListLength(L)
//返回线性表L的元素个数 -
LocateElem(L, e)
// L中查找与给定值e相等的元素,若成功返回该元素在表中的序号,否则返回0 -
GetElem(L,i, &e)
// 将线性表L中的第i个位置元素返回给e
定义线性表
#define MAXSIZE 100
typedef struct{
ElemType *elem;
int length;
} SqList;
顺序表基本操作的实现
1.构造顺序表
Status InitList Sq(SqlList &L){
//构造一个空的顺序表L
L.elem= new ElemType[MAXSIZE]; //1.为顺序表分配空间
if(!L.elem) exit(OVERFLOW); //2.判断是否有足够的存储空间:存储分配失败退出,分配成功,则继续执行
L.length=0; //3.空表:长度为0
return OK;
}
//status用来返回本函数是否执行成功:1.OK 2.ERROR 3.OVERFLOW
//!L.elem :如果不存在
2.销毁顺序表
void DestroyList(SqList &L) {
if (L.elem)
delete L.elem; //释放存储空间
}
3.顺序表的取值(根据位置 i 获取相应位置数据元素的内容) 随机存取
Status GetElem(SqList L, int i, ElemType &e){
if (i<1 || i>L.length) return ERROR; //第一步:判断i值是否合理,若不合理,返回ERROR
e=L.elem[i-1]; //第二步:elem[i-1]单元存储第i个数据元素
return OK; //查找成功
}
//e=L.elem[i-1]; 返回的是数组下标,而不是元素位置,所以是i—1
4.顺序表的查找
算法思想:
- 在线性表L中查找与指定值e相同的数据元素的位置
- 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0。
按值查找:时间复杂度:最好O(1) 平均O(n) 最坏O(n)
int LocateElem (SqList L, ElemType e){
//在顺序表L中查找值为e的数据元素,返回其序号
for(i=0;i< L.length;i++)
if(L.elem[i]==e) return i+1; //查找成功,返回序号i+1
return 0; //查找失败,返回0
}
5.顺序表的插入
算法思想:
- 判断插入位置i是否合法。</