线性表的顺序表示与实现

1.顺序表的存储结构:

//顺序表的存储结构
#define MAXSIZE 100

typedef struct
{
	ElemType *elem;
	int length;
}SqList;

2.初始化:构造一个空的顺序表.

算法步骤: 

1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址. 2.将表的当前长度设为0.                                                                                                                 

算法描述:

//初始化
Status Initlist(SqList* L)
{
	L->elem = new ElemType[MAXSIZE];
	if (!L->elem)
	{
		return ERROR;
	}
	L->length = 0;
	return OK;
}

3.顺序表的取值:获取顺序表中第i个数据元素的值.

算法步骤:                                                                                                                                       

1.判定指定的位置序号i值是否合理(i<=i<=L->length),若不合理,则返回ERROER. 2.若i值合理,则将第i个元素L.elem[i-1]赋给参数e,通过e返回第i个数据元素的传值.

算法描述:

//获取顺序表的值
Status GetElem(SqList L, int i, ElemType e)
{
	if (L.length == 0 || i<1 || i>L.length) //表为空或i的值不合法.
	{
		return ERROR;
	}
	e = L.elem[i - 1];//获取的值.
	return OK;
}

4.查找:根据指定的元素值e,查找顺序表中的第一个与e相等的元素.

算法步骤:                                                                                                                                       

1.从第一个元素起,依次和e相比较,若找到与e相等的元素L->elem[i],则查找成功,返回该元素的序号i+1. 2.若查找整个顺序表都没有找到,则查找失败,返回0.

算法描述:

//查找
int LocateElem(SqList* L, ElemType e)
{
	for (int i = 0; i < L->length; i++)
	{
		if (e == L->elem[i]) return i + 1;
	}
	return 0;
}

5.插入:在表的第i个位置插入一个新的数据元素e,使长度为n的线性表变为长度为n+1的线性表.

算法步骤:                                                                                                                                       

1.判断插入位置是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回ERROR. 2.判断顺序表的存储空间是否已满,若满则返回ERROR.  3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动).  4.将要插入的新元素e放到第i个位置上. 5.表长加一.

算法描述:

//插入
Status ListInsert(SqList* L, int i, ElemType e)
{
	if (L->length == MAXSIZE)//表的长度超出限制,即存储空间已满
	{
		return ERROR;
	}
	if (i<1 || i>L->length + 1) //插入数据的位置不合法.
	{
		return ERROR;
	}
	if (i <= L->length) //插入数据的位置不在表的末尾
	{
		for (int j = L->length-1; j >= i - 1; j--)
		{
			L->elem[j + 1] = L->elem[j];   //将i后面的数据依次往后移一位.
		}
	}
	L->elem[i - 1] = e;
	L->length++;
	return OK;
}

6.删除:将表的第i个元素删去,将长度为n的线性表变为n-1的线性表.

算法步骤:                                                                                                                                       

 1.判断删除的位置是否合法(合法值为1<=i<=n),若不合法则返回ERROR.  2.将第i+1个至第n个的元素依次向前移动一个位置(i=n时无需移动). 3.表长减一.

算法描述:

//删除
Status ListDelete(SqList* L, int i, ElemType* e)
{
	if (L->length == 0) //表为空,不能删除元素.
	{
		return ERROR;
	}
	if (i<1 || i>L->length) //删除元素的位置不合法.
	{
		return ERROR;
	}
	*e = L->elem[i - 1]; //删除元素的值.
	if (i < L->length)  //删除的元素不在表的末尾,将后面的元素依次前移一位.
	{
		for (int j = i; j < L->length; j++)
		{
			L->elem[i-1] = L->elem[i];
		}
	}
	L->length--;//表长减一.
	return OK;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值