数据结构之美(三)线性表的顺序存储结构

(总结源自《大话数据结构》,初学数据结构推荐此书)

目录

线性表(List)

线性表的顺序存储结构

线性表的存储地址

线性表的基本操作

GetElem(L,i,*e) 

ListInsert(*L,i,e)

ListDelete(*L,i,*e)


线性表(List)

线性表是数据结构中最常用和最简单的一种结构,定义如下

线性表:零个或多个数据元素的有限序列

线性结构:一对一

在较复杂的线性表中,一个数据元素可以由若干个数据项组成

 

线性表的顺序存储结构

线性表顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素,可以用一维数组来实现。

在农场(也就是内存空间)中找了一块连续的空地(存储单元),把一个个萝卜(元素)按顺序种了下去)

 

描述顺序存储结构需要三个属性:

1.存储空间的起始位置:数组的存储位置就是存储空间的存储位置

2.线性表的最大存储容量:数组长度MaxSize

3.线性表的当前长度:length

(数组长度与线性表长度的区别:数组长度指的是存放线性表的存储空间的长度,分配后一般是不变的。线性表长度是线性表中数据元素的个数,是变化的。 在任意时刻,线性表的长度应该是小于等于数组的长度,数组就像一字排开的椅子,线性表就像人,位置只能空着或坐满,不能超过。)

 

线性表的存储地址

(线性表从1开始,而数组从0开始,也就是说:线性表的第i个元素存储在数组的第i-1个位置上)

地址计算方法可算出线性表中任意位置的地址(c是单个元素所占的空间的大小)

 

线性表的基本操作

InitList(*L):初始化操作,建立一个空的线性表L

ListEmpty(L):若线性表为空,返回true,否则返回false

ClearList(*L):将线性表清空

ListLength(L):返回线性表L的元素个数

GetElem(L,i,*e):将线性表L中的第i个位置元素返回给e

LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功,否则返回0表示失败

ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e

ListDelete(*L,i,*e):删除线性表L中的第i个位置元素,并用e返回其值

这些最基本的操作,更加复杂的操作可以使用这些操作的组合来实现。

 

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
//Status 是函数的类型,其值是函数结果状态代码,如OK等

typedef struct
{
	ElemType data[MAXSIZE];//存放线性表的数组
	int length;             //length是线性表的长度 
} SqList;

GetElem(L,i,*e) 

功能:将线性表L中的第i个位置元素返回给e

主要考虑以下几点:1,表是否存在(L.length == 0)  2,这个位置是否合理(在不在表中)(1<i<L.length)

Status GetElem(SqList L, int i, ElemType *e) //结果:用e返回L中第i个数据元素的值
{   
	if (L.length == 0 || i < 1 || i > L.length)
		return ERROR;
	*e = L.data[i - 1];
	return OK;
}

 

ListInsert(*L,i,e)

功能:在线性表L中的第i个位置插入新元素e

主要考虑以下几点:1,表是否还能继续插入(满了没有) 2,插入位置是否合理(在不在表中)


Status ListInsert(SqList *L, int i, ElemType e)
{
	int k;
	if (L->length == MAXSIZE||i < 1 || L->length + 1) //表已满||插入的位置不在表中
		return ERROR;

	if (i <= L->length)//如果插入的位置不在表尾,将插入位置后的元素往后移动
	{
		for (k = L->length - 1; k > i - 1; k--)
			L->data[k + 1] = L->data[k];
	}
	L->data[i - 1] = e;//i是插进i-1的地方
	L->length++;
	return OK;
}

ListDelete(*L,i,*e)

功能:删除线性表L中的第i个位置元素,并用e返回其值

主要考虑以下几点:1,表是否存在(L.length == 0)    2,插入位置是否合理(在不在表中)

Status ListDelete(Sqlist *L, int i, ElemType *e)
{
	int k;
	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; < L->length; k++)
			L->data[k - 1] = L->data[k];
	}
	L->length--;  //表长减一
	return OK;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值