2.4.1线性表的顺序存储进阶

线性表的逻辑位序与物理位序差一,也就是说从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开始数的

 平均查找长度为\frac{n+1}{2}

算法五 顺序表的插入

注意:(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。

平均移动元素的个数为\frac{n-1}{2}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值