带你认识顺序表——基本的数据结构

       顺序表是一种基本的数据结构,它在程序设计和算法实现中扮演着重要的角色。顺序表的概念源于数学中的向量或数组,是一种线性表数据结构,其元素按照线性顺序排列,并通过一组连续的存储单元来存储数据。本文介绍了顺序表的分类以及对动态顺序表的实现,希望大家能够有所收获。

目录

1.顺序表的概念及结构

1.1线性表

1.2顺序表的分类

静态顺序表

动态顺序表

2.动态顺序表的实现

2.1创建结构体

2.2初始化

2.3检查空间是否满了并开辟空间

2.4打印顺序表

2.5在最前面插入一个数据

2.5删除最前面的一个数据

2.6在尾部插入一个数据

2.7删除尾部的一个数据

2.8指定位置前插入一个数据

2.9指定位置删除一个数据

2.10销毁


1.顺序表的概念及结构

1.1线性表

        线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 所以顺序表是线性表的一种。
        线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.2顺序表的分类

静态顺序表

使⽤定⻓数组存储元素

 静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

动态顺序表

2.动态顺序表的实现

2.1创建结构体

typedef int SLDateType;
typedef struct SeqList
{
	SLDateType* arr;
	int size;
	int capacity;
}SL;

2.2初始化

void SLinit(SL* ps)
{
	ps->arr = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

2.3检查空间是否满了并开辟空间

void SLcheck(SL* ps)
{
	
	
	//如果内容存满了
	if (ps->size == ps->capacity)
	{
		//如果空间为0
		if (ps->capacity == 0)
		{
			ps->capacity = 4;
		}
		//realloc申请空间给tmp
		SLDateType* tmp = (SLDateType*)realloc(ps->arr, ps->capacity * sizeof(SLDateType));
		//申请失败
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		//申请成功 tmp指向arr
		ps->arr = tmp;
	}
	
}

2.4打印顺序表

void SLprint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

2.5在最前面插入一个数据

void SLpushfront(SL* ps, SLDateType x)
{
	//检查空间是否足够
	SLcheck(ps);
	//从后向前把每一位往后挪一位
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	//插入x
	ps->arr[0] = x;
	ps->size++;
}

2.5删除最前面的一个数据

void SLpopfront(SL* ps)
{
	for (int i = 0; i<ps->size; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->arr[ps->size - 1] = 0;
	ps->size--;
}

2.6在尾部插入一个数据

void SLpushback(SL* ps, SLDateType x)
{
	//检查空间是否足够
	SLcheck(ps);
	//直接在最后插入
	ps->arr[ps->size] = x;
	ps->size++;
}

2.7删除尾部的一个数据

void SLpopbake(SL* ps)
{
	ps->arr[ps->size-1] = 0;
	ps->size--;
}

2.8指定位置前插入一个数据

void SLinsert(SL* ps, int pos, SLDateType x)
{
	//检查空间是否足够
	SLcheck(ps);
	//从后向前 把每一位向后挪一位 直到指定位置停下
	for (int i = ps->size; i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}

2.9指定位置删除一个数据

void SLerase(SL* ps, int pos)
{
	for (int i = pos; i<ps->size; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->arr[ps->size] = 0;
	ps->size--;
}

2.10销毁

void SLdestory(SL* ps)
{
	if (ps->arr != NULL)
	{
		free(ps->arr);
	}
		ps->arr = NULL;
		ps->size = ps->capacity = 0;
}

       顺序表作为一种基本的数据结构,在C语言编程中具有重要的地位。它简单、高效,适用于许多场景,但同时也存在一些局限性。了解顺序表的原理和特点,能够帮助我们更好地设计程序和实现算法。在实际应用中,我们需要根据具体需求,合理选择和使用顺序表,以发挥其最大的优势。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值