嵌入式C语言入门——顺序表

顺序表

用一组连续地址的内存单元存储整张线性表,称为顺序存储结构,这种存储结构下的线性表叫做顺序表

  • 有唯一的表名来标识该顺序表
  • 内存单元连续存储,一张顺序表要占据一块连续的内存空间
  • 数据顺序存放,元素之间有先后关系

定义顺序表结构

在这里插入图片描述

typedef struct _seq
{
	Data *pData;    // 顺序表的存储空间
	int maxSize;    // 最大存储空间
	int size;       // 当前使用的空间
}Seq;

创建顺序表

Seq* Create()
{
	Seq *s = (Seq*)malloc(sizeof(Seq)/sizeof(char));
	if (NULL == s)
		return NULL;
	
	// 给顺序表分配空间
	s->pData = (Data*)malloc(sizeof(Data)/sizeof(char) * INIT_SIZE);
	if(NULL == s->pData)
	{
		free(s);
		return NULL;
	}
	
	s->maxSize = INIT_SIZE;
	s->size    = 0;
	
	return s;
}

顺序表重新分配空间

如果数据个数大于当前顺序表最大的存储空间,对当前顺序表存储空间进行扩展,调用realloc函数

realloc原型
extern void *realloc(void *mem_address, unsigned int newsize);

注意:申请的空间newsize是原空间大小再加上再次分配空间大小(maxSize+ADD_SIZE),而不是需要申请空间的大小(ADD_SIZE)

BOOL AgainMalloc(Seq* s)
{
	if(NULL == s)
		return ERROR;
	
	int newSize = sizeof(Data)/sizeof(char)*(s->maxSize+ADD_SIZE);
	
	Data* p = (Data*)realloc(s->pData, newSize);
	if (NULL == p)
		return FALSE;
	
	s->pData    = p;
	s->maxSize += ADD_SIZE;
	
	return TRUE;
}

顺序表尾插

在这里插入图片描述
从顺序表尾部添加数据,如果当前顺序表已经达到最大空间(maxSize),调用AgainMalloc()进行空间扩展

BOOL Insert_Last(Seq* s, Data data)
{
	if (NULL == s)
		return ERROR;
	//重新分配空间
	if (s->size == s->maxSize)
	{
		if (AgainMalloc(s) != TRUE)
			return FALSE;
	}
	
	s->pData[s->size++] = data;
	return TRUE;
}

顺序表头插

在这里插入图片描述
从顺序表头添加数据,如果当前顺序表已经达到最大空间(maxSize),调用AgainMalloc()进行空间扩展。
将顺序表中所有元素一次向后移动一个单元,空出第一个元素空间,插入数据。

BOOL Insert_Head(Seq* s, Data data)
{
	//入口参数检测
	if (NULL == s)
		return ERROR;
	//顺序表空间已满
	if (s->size == s->maxSize)
	{
		if (AgainMalloc(s) != TRUE)
			return FALSE;
	}
	//挪出第一个空间
	int i = 0;
	for (i = s->size-1; i>=0; i--)
	{
		s->pData[i+1] = s->pData[i];		
	}
	s->pData[0] = data;
	s->size++;
	
	return TRUE;
}

顺序表任意位置插入

通过(size-1)定位到顺序表最后一个元素
PS:当前使用了空间为size,最后一个元素数组中的下标为size-1
将指定位置index后的和size-1之前的所有元素往后移位一个元素
将数据存入index所在空间,并将记录当前顺序表使用空间的size加一
在这里插入图片描述

BOOL Insert_Pos(Seq *s, int index, Data data)
{
	if (NULL == s)
		return FALSE;
	//空间不够分配空间
	if (s->size == s->maxSize)
	{
		if (TRUE != AgainMalloc(s))
			return FALSE;
	}

	int i; 
	for (i = s->size-1; i >= index; i--)
	{
		s->pData[i+1] = s->pData[i];
	}

	s->pData[index] = data;	//插入数据
	s->size++;	//当前使用空间+1
	return TRUE;
}

删除顺序表中某个空间元素

在这里插入图片描述
类比顺序表的任意位置插入,先从size-1出向前寻找到index的位置,将index后所有元素向前挪一个空间,注意将当前顺序表使用空间size进行减一操作

void Delete_Pos(Seq *q, int index)
{
	if (NULL == q)
		return;
	int i = index;
	for (i = index; i <= size-1; i++)
	{
		q->pData[i] = q->pData[i+1];
	}
	//别忘了将顺序表当前使用空间size进行减一操作
	q->size--;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值