数据结构~线性表1
线性表:零个或多个数据元素的有限序列
1 线性表的抽象数据类型
ADT 线性表
Data
线性表的数据集合为(a1,a2,a3,a4,...,an),每个元素的数据类型均为DataType.其中,除第一个元素a1外,每个元素有且仅有一个直接前驱元素;除最后一个元素an外,每个元素有且仅有一个直接后继元素。数据元素之间的关系是一一对应的关系。
Operation
InitList(*L); 初始化操作,建立一个空的线性表L;
ListEmpty(*L); 若现行表为空则返回true, 否则返回false.
ClearList(*L); 将线性表清空。
GetElm(*L, i, *e); 将线性表中第i个位置的元素返回给e.
LocateElem(L, e); 在线性表中查找与给定植e相等的元素,如果查找成功,返回该元素在表中的序号;否则返回0表示失败;
ListInsert(*L, i, e); 在线性表的第i个位置插入新元素e;
ListDelete(*L, i, *e); 删除线性表中第i个位置元素,并用e返回其值;
ListLength(L); 返回线性表元素的个数;
endOperation
2 线性表的顺序存储结构
线性表的顺序存储结构指用一段地址连续的存储单元依次存储线性表的数据元素;
线性表顺序存储的结构代码
#define MAXSIZE 20 /* 存储空间的初始分配量 */ typedef int ElemType /* 类型根据实际情况定,这里假设int*/ typedef sruct { ElemType data[MAXSIZE]; int length; }SqList;
顺序存储结构有3个属性:
存储空间的起始位置:数组data,它的存储位置就是存储空间的起始位置;
线性表的最大存储容量:数组长度MaxSize.
线性表的当前长度: length;
顺序存储结构的获取元素、插入和删除操作
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; /* * Status是函数的类型,其值是函数结果状态代码,如OK等; * 初始条件:顺序线性表已经存在, 1<=i<=ListLength(L) * 操作结果:用e返回L中第i个数据元素的值; */ Status GetElem(SqList L, int i, ElemType *e) { if (L.length == 0 || i < 1 || i > L.length) return ERROR; *e=L.data[i-1]; return OK; } Status ListInsert(*L, i, e) { if (i < 1 || i > MAXSIZE ) return ERROR; int j = 0; for (j=L->length; j>=i; j--) { L->data[j] = L->data[j-1]; } L->data[i-1] = e; L->length++; return OK; }
// 删除L的第i个数据元素,并用e返回其值,L的长度减1 Status ListDelete(Sqlist *L, int i; ElemType *e) { int k=0; if(L->length==0) return ERROR; if(i<1 || i > L->length) return ERROR; *e = L->data[i-1]; if (i < L->length) { for (k=i; k<L->length; k++) { L->data[k-1] = L->data[k]; } } L->length--; return OK; }
线性表顺序存储结构的优点和缺点:
优点: 无须为表示表中元素之间的逻辑增加额外的存储空间; 可以快速的存取表中的任意位置元素;
缺点: 插入和删除操作需要移动大量元素; 当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的碎片;