线性表的逻辑位序与物理位序差一,也就是说从0开始计位数
#define LIST_INT_SIZE 100 //线性表存储空间的初始分配量
typedef struct {
ElemType elem[LIST_INIT_SIZE];//一个数组,数组静态分配
int length; //当前长度
}SqList;
SqList是列表类型,例如int是整数类型。定义变量以后才会分配内存空间。
SqList L建立一个列表L,例如int a建立一个整型数a
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char ElemType;
算法一 线性表的初始化
Status InitList_Sq(SqList& L) { //构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE];//为顺序表分配空间
if (!L.elem)exit(OVERFLOW);//存储分配失败
L.length = 0;//空表长度为0
return OK;
}
算法二 线性表周边
//线性表的销毁
void DestroyList(SqList& L) {
if (L.elem)delete L.elem;//释放存储空间
}
//线性表的清空
void ClearList(SqList& L) {
L.length = 0;//将线性表的长度置为0
}
//求线性表L的长度
int GetLength(SqList L) {
return(L.length);
}
判断线性表L是否为空
int IsEmpty(SqList L) {
if (L.length == 0)return 1;
else return 0;
}
算法三 顺序表的取值
//取第i个位置的元素
int GetElem(SqList L, int i, ElemType& e) {
if (i<1 || i>L.length)return ERROR;//判断位置是否合理
e = L.elem[i - 1];
return OK;
}
算法四 顺序表的查找(按值查找)
//在顺序表中查找数值为e的元素的位置返回其序号
int LocateElem(SqList L, ElemType e) {
for (i = 0; i < L.length; i++) {
if (L.elem[i] == e)return i + 1;//查找成功,返回其序号
}
return 0;//查找失败,返回0
}
//第i个是从1开始数的
平均查找长度为
算法五 顺序表的插入
注意:(1)判断i的位置是否合理(0-n+1)
(2)存储空间是否已满
(3)往后移
Status Listlnsert_Sq(SqList& L, int i, ElemType e) {
if (i<1 || i>leng + 1)return ERROR;
if (L.length==MAXSIZE)return ERROR;
for (j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
return OK;
}
6个元素6+1个位置
算法六 顺序表的删除
Status ListDelete__Sq(SqList& L, int i) {
if ((i < 1) || (i > L.length))return ERROR;
for (j = i; j < L.length - 1; j++) {
L.elem[j - 1] = L.elem[j];
}
L.length--;
return OK;
}
从当前删除的i处开始直到最后一个元素,为L.length-1。
平均移动元素的个数为