顺序表的基本操作_【数据结构】顺序表基本操作的实现(C语言)

本文介绍了线性表的顺序存储结构——顺序表,包括顺序表的定义、动态分配,以及元素的插入、删除和按值查找的操作。顺序表在逻辑上相邻的元素在物理存储上也是相邻的,常使用数组实现。在C和C++中,动态分配数组用于创建顺序表。插入、删除和查找操作在不同情况下有不同的时间复杂度。
摘要由CSDN通过智能技术生成

e81d084085198de12953e01452b2a582.png

线性表的顺序存储称为顺序表

线性表元素为逻辑上相邻,顺序存储时在物理上也相邻(以数组的形式进行存储)

L=(

equation?tex=a_%7B1%7D ,
equation?tex=a_%7B2%7D ,...,
equation?tex=a_%7Bi%7D ,
equation?tex=a_%7Bi%2B1%7D ,...
equation?tex=a_%7Bn%7D
)

c8bbc69d9a4ef29e8a71082d60f7ec4a.png

注意:

  • 顺序表下标从1开始,而数组下标从0开始
  • 数组大小是固定的,线性表的大小不是固定的
  • 顺序表是一维的,而数组可以是多维的

1,顺序表的定义:

数组静态分配

#define MaxSize 50
#define ElemType int 
typedef struct 
{
	ElemType data[MaxSize];
	int length;
}SqList;

数组动态分配

#define MaxSize 50
#define ElemType int 
typedef struct
{
	ElemType* data;
	int length;
}SqList;

通过将数组定义为指针类型可以实现数组的动态变化,但此时的data仅是定义的变量(表示初始地址),使用时需要动态分配内存(为数组分配空间)。

动态分配语句(其中InitSize为需要的元素个数):

C L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

C++ L.data=new ElemType[InitSize];

2,顺序表中元素的插入:

在顺序表的i位置上插入e

bool ListInsert(SqList& L, int i, ElemType &e) 
  //&L表示引用类型,使用引用可以改变L,而不仅仅是值传递
{
	if (i<1 || i>L.length + 1)         //位置不能为0或负数,也不能使顺序表之间有间隔
		return false;
	if (L.length >= MaxSize)           //顺序表的长度不能超过数组的长度
		return false;
	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1];    //将i位置之后的数据依次
		L.data[i - 1] = e; 
		L.length++;
		return true;
	}
}

最好时间复杂度:O(1) 平均时间复杂度:O(n) 最坏时间复杂度:O(n)

3,顺序表中元素的删除:

删除顺序表i位置上的数据,存储到e

bool ListDelete(SqList& L, int i, ElemType e)
{
	if (i<1 || i>L.length)
	{
		return false;
	}
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
		L.length--;
		return true;
	}
}

最好时间复杂度:O(1) 平均时间复杂度:O(n) 最坏时间复杂度:O(n)

4,顺序表的按值查找:

int LocateElem(SqList L, ElemType e)
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (L.data[i] == e)
		{
			return i + 1;
		}
		return 0;
	}
}

查找成功则返回元素e在顺序表中的位置

最好时间复杂度:O(1) 平均时间复杂度:O(n) 最坏时间复杂度:O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值