数据结构(扩容顺序表)

1.1  顺序表的定义

线性表的顺序存储结构,指的是用一段地址连续的储存单元依次存储线性表的数据元素

所以我们需要一个数组来存放数据,一个整形来记录线性表当前长度,还有一个来记录当前线性表最大的存储量。

1.2  扩容顺序表的初始化

可扩容的顺序表相比与定长顺序表要多一个整型值来保存最大容量个数。

根据上图分析代码如下:

typedef struct Dsqlist
{
	int length;
	int list_size;
	ELEM_TYPE* data;//接受从堆内申请来的空间
}Dsqlist ,*PDsqlist;

1.2  任意位置插入函数

 

设计思路:

①先进行断言(防止 p指针为空指针)

②判断插入位置是否合法

③要进行判满操作(这里记住一个规律 :插入时要进行判满操作,删除时进行判空操作

如果发现若空间满了则扩容,让用户感觉到好似是无限空间在这里就要开始调用扩容函数了。

④开始腾位置

⑤执行到此时待插入位置空出,插入即可(一定要记着p->length++),将要插入的val值赋给p->data[pos]

根据上述分析代码如下

//任意位置插入数据
bool Insert_pos(PDsqlist p, int pos, int val)
{
	//1、断言
	assert(p != NULL);//指针判空	保不定长顺序表头节点存在
	if (p == NULL) return false;
	//2、判断插入位置是否合法
	assert(pos > 0 && pos <= p->length);//插入值合法判断
	if (pos<0 || pos>p->length) return printf("不能删除在该位置插入");
	//判满操作
	if (IsFull(p))//判满操作   若空间满则扩容,让用户感觉到好似是无限空间
	{
		Inc(p);
	}
	//此时,执行到此保证有足够空间
	for (int i = p->length-1; i>=pos;i--)
	{
		p->data[i] = p->data[i + 1];
	}
	//此时,执行到此已将待插入位置空出
	p->data[pos] = val;
	return true;
	p->length++;

	
}

1.3任意位置删除函数

 设计思路:

①先进行断言(防止 p指针为空指针)

②判断删除位置是否合法

③开始挪动要删除元素的下一个元素(例:要删除pos,就int i=pos+1 ,最后一个需要挪动的数据下标为p->length)(一定要记着p->length--

//任意位置删除数据
bool Del_pos(PDsqlist p, int pos)
{
	assert(p != NULL);
	if (p == NULL) return false;
	if (pos < 0 || pos >= p->length)   return printf("您所删除的位置不存在:");
	
	//i指向第一个要挪动的元素下标,最后一个需要挪动的数据下标为p->length
	for (int i = pos + 1; i < p->length; i++)
	{
		p->data[i + 1] = p->data[i];
	}
	p->length--;
}

1.4判空函数、判满函数

//判空操作
bool IsEmpty(PDsqlist p)
{
	return p->length == 0; 
}
//判满操作
bool IsFull(PDsqlist p)
{
	return p->length = p->list_size;
}

1.5扩容函数

//扩容
void Inc(PDsqlist p)
{
	//realloc                            (第二个参数:需要的是 新开辟内存的总大小(以字节为单位))
	p->data=(ELEM_TYPE*)realloc(p->data, p->list_size * sizeof(ELEM_TYPE) * 2);
	p->length;//扩容不会涉及有效长度的改变
	
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值