顺序表的实现

本文介绍了顺序表的基本概念,包括其作为数组形式的线性表特点,以及顺序表的优缺点。详细讲解了C语言中顺序表的初始化、销毁、扩容、插入和删除等操作的接口实现。
摘要由CSDN通过智能技术生成

一.什么是顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

二.顺序表的优缺点

①优点

1.尾插、尾删效率较高,时间复杂度是O(1)

2.支持随机访问,可以高效的按下标进行操作,时间复杂度是O(1)

②缺点

1.在顺序表中间插入或删除元素时都涉及到元素的移动,效率较低,时间复杂度为O(N)
2.顺序表长度固定,有时需要扩容

三.有关顺序表的接口实现

①顺序表的初始化

void SLInit(SL* sl)
{
	assert(sl);
	sl->a = (SLDatetype*)malloc(40);
	sl->size = 0;
	sl->capacity = 0;
}

注:这里初始化地址a也可以为NULL 

②顺序表的销毁

void SLDestroy(SL* sl)
{
	assert(sl);
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

③检查顺序表是否需要扩容

void SLCheckCapacity(SL* sl)
{
	assert(sl);
	if (sl->capacity == sl->size)
	{
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		SLDatetype* tmp = (SLDatetype*)realloc(sl->a, newcapacity * sizeof(SLDatetype));//使用tmp临时变量,防止开辟失败
		if (tmp != NULL)
		{
			sl->a = tmp;
			sl->capacity = newcapacity;
		}
	}
}

 注:这里的newcapacity用到了三目操作符,realloc时,先赋值给临时地址tmp

④顺序表的头部插入

void SLPushFront(SL* sl, SLDatetype x)
{
	assert(sl);
	SLCheckCapacity(sl);
	int tag = 0;//设置tag检查位,完成空表的头插
	if (sl->size == 0)
	{
		sl->a[0] = x;
		sl->size++;
		tag = 1;
	}
	if (tag == 0)
	{
		int end = sl->size;//end不可为sl->size,因为这个初始值为0
		while (end >= 1)
		{
			sl->a[end] = sl->a[end - 1];//数据后移
			end--;
		}
		sl->a[0] = x;
		sl->size++;
	}
}

⑤顺序表的尾部插入

void SLPushBack(SL* sl, SLDatetype x)
{
	assert(sl);
	SLCheckCapacity(sl);
	sl->a[sl->size] = x;
	sl->size++;
}

⑥顺序表的头部删除

void SLPopFront(SL* sl)
{
	assert(sl);
	int begin = 0;
	while (begin != sl->size -1)
	{
		sl->a[begin] = sl->a[begin + 1];
		begin++;
	}
	sl->size--;
}

⑦顺序表的尾部删除

void SLPopBack(SL* sl)
{
	assert(sl);
	if (sl->size > 0)
	{
		sl->size--;
	}
	else
	{
		printf("没有数据删除!\n");
	}
}

⑧打印顺序表

void SLPrint(SL* sl)
{
	assert(sl);
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}

⑨在pos下标处,删除元素

void SLDel(SL* sl, int pos)
{
	assert(sl);
	while (pos + 1 != sl->size)
	{
		sl->a[pos] = sl->a[pos + 1];
		pos++;
	}
	sl->size--;
}

⑩在pos下标前,插入元素

void SLInsert(SL* sl, int pos, SLDatetype x)
{
	assert(sl);
	SLCheckCapacity(sl);
	int end = sl->size;
	while (end != pos)
	{
		sl->a[end] = sl->a[end - 1];
		end--;
	}
	sl->a[pos] = x;
	sl->size++;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值