线性表----顺序表

线性表的定义

线性表是具有相同数据类型的n个数据元素的有限序列,除第一个元素外,每个元素只有一个前驱,除最后一个元素外,每个元素都有一个后继

物理结构

顺序存储和链式存储

顺序表

线性表的顺序存储又称顺序表。特点是用一组地址连续的存储单元依次存储数据,从而使逻辑相邻的两个元素在物理地址上也相连。

#define MaxSize 50		//定义线性表最大长度
typedef int ElemType;		//定义数据类型

typedef struct{
	ElemType data[MaxSize];	//用一维数组来存储数据
	int length;							//定义线性表的当前长度
}SqList;

上面是用一位数组是静态分配,也可以用动态分配

#define InitSize 100
typedef struct{
ElemType *data;
int MaxSize,length;
}SqList;

顺序表特点

  • 随机访问
  • 存储密度高,因为物理地址连续

基本操作

1、插入

在顺序表L的第i个位置插入新元素e,如果插入位置i不合法,则返回false;如果顺序表满了,返回false;否则,将顺序表的第i个元素及其后所有的元素右移一位

bool ListInsert(SqList& L, int i, ElemType e)
{
	if (i<1 || i>L.length + 1)	//此处注意是length+1,不能是MaxSize
		return false;
	if (L.length >= MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
	{
		L.data[j] = L.data[j-1];
	}
	L.length++;
	return true;
}

时间复杂度问题:
下面理解的时候,可以将n理解为length

  • 最好情况下:在表尾插入,即i=n+1,后移语句不会执行,时间复杂度为T(n)=0(1);
  • 最坏情况:在表头插入,即i=1,后移n次,时间复杂度为0(n)
  • 平均情况:p=1/(n+1),时间复杂度为0(n)
    在这里插入图片描述
2、删除操作

删除顺序表L中第i个位置的元素,若成功则返回true,并将被删除的元素返回,否则返回false

  • 判断i的值是否正确
  • 取删除的元素
  • 将被删除元素后面的所有元素依次向前移动一位
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;
}

时间复杂度

  • 最好情况:删除表尾元素(i=n),无序移动,时间复杂度为0(1)
  • 最坏情况:删除表头元素(i=1),需要移动第一个元素外所有的元素,时间复杂度为0(n)
  • 平均情况:时间复杂度为0(n)
3、按值查找

在顺序表查找第一个元素值等于e的元素,并发回其位序

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

时间复杂度

  • 最好情况:第一个元素就是,在表头,T(n)=0(1)
  • 最坏情况:查找元素在表尾或者不存在时,需要比较n次,时间复杂度为0(n)
  • 平均情况:T(n)=0(n)

缺点

顺序表的移动、删除需要移动很多的元素,影响运行效率

发布了168 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41683305/article/details/104311915