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);