笔记 顺序表(2)

1.顺序表插入数据元素

typedef int elemtype;
typedef struct
{
	elemtype* data;
	int capacity;//容量
	int cursize;//元素的个数
}seqlist;

bool insertItem(seqlist* plist, int pos, elemtype val)
{
    assert(plist != NULL);
    if (pos<0 || pos>plist->cursize)//先判断pos是否合法
    {
        return false;
    }

    if (isfull(plist) && !Inc_capacity(plist))//先判断是否表满了,满了,然后增容,如果增容成功,返回真,求反为假,不执行return
    {
        return false;
    }
    for (int i = plist->cursize; i > pos; --i)
    {
        plist->data[i] = plist->data[i - 1];
    }
    plist->data[pos] = val;
    plist->cursize += 1;
    return true;
}

头插 通过调用插入函数,完成特殊插入

void push_back(seqlist* plist, elemtype val)
{
	assert(plist != NULL);
	insertItem(plist, plist->cursize, val);
}

尾插

void push_front(seqlist* plist, elemtype val)
{
	assert(plist != NULL);
	insertItem(plist, 0, val);
}

2.顺序表增容

申请更大的空间,用newdata指向他,再将原有的数据复制到新的空间中,释放原来的空间(free),最后data指针指向newdata

先获取当前元素个数

bool getsize(const seqlist* plist)
{
	assert(plist != NULL);
	return plist->cursize;
}

判断是否为空

bool isempty(const seqlist* plist)
{
	assert(plist != NULL);
	return getsize(plist) == 0;
}

判断是否为满

bool isfull(const seqlist* plist)
{
	assert(plist != NULL);
	return getsize(plist) == plist->cursize;
}

顺序表增容

bool Inc_capacity(seqlist* plist)
{
	assert(plist != NULL);
	elemtype* newdata = NULL;//创造一个新的指针
	int total = plist->capacity * seq_inc_size;//新空间大小是原来的二倍
	newdata = (elemtype*)malloc(sizeof(elemtype) * total);//为新空间申请内存
	if (NULL == newdata)//增容失败
	{
		return false;
	}
	for (int i = 0; i < plist->capacity; ++i)//把原来的表中的数据移入新表
	{
		newdata[i] = plist->data[i];
	}
	free(plist->data);//释放原来的空间
	plist->data = newdata;//指向新的空间
	plist->capacity = total;//指向新的容量
	return true;
}

也可以用memmove代替for循环来移动数据到新的表中

memmove(newdata, plist->data, sizeof(elemtype) * plist->capacity);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值