1.顺序表的增加:
分为三种情况:尾插,头插,按位置插
>尾插:依次将数据插入到上一个数据的后面,有效元素个数应小于数组长度:
void SeqListPushBack(SeqList *pSL,DataType data)
{
assert(pSL);
assert(pSL->size < MAX_SIZE);
pSL->array[pSL->size] = data;
pSL->size++;
}
>头插:将数据插入到顺序表的头部,即数组第一个元素位置,分三种情况:
void SeqListPushFront(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
assert(pSL->size < MAX_SIZE);
//第一种:以要搬的数做循环指示
#if 1
int pos;
for (pos = pSL->size - 1; pos >= 0; pos--)
{
pSL->array[pos + 1] = pSL->array[pos];
}
#endif
//第二种:以要搬的位置做循环
#if 0
int pos;
for (pos = pSL->size ; pos >0; pos--)
{
pSL->array[pos] = pSL->array[pos-1];
}
#endif
//第三种:以循环次数做循环指示
#if 0
int pos;
for (pos = 0; pos<pSL->size ; pos++)
{
pSL->array[pSL->size -pos] = pSL->array[pSL->size -pos-1];
}
#endif
pSL->array[0] = data;
pSL->size++; //插入之后有效长度+1
}
>按下表插入数据:找到给定下表位置,后面的元素依次往后移一位:
void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
assert(pSL != NULL);
assert(pSL->size > 0);
assert(pos >= 0 && pos < pSL->size);
//将pos后面的位置往后挪一个
int p;
for (p = pSL->size - 1; p>pos; p--)
{
pSL->array[pos + 1] = pSL->array[pos];
}
pSL->array[pos] = data;
pSL->size++; //插入之后有效长度+1
}
2.删除:把删除分为五种:尾删,头删,按下标删,按值删遇到的第一个数据,按值删遇到的所有数据:
>尾删:只需要有效长度-1
void SeqListPopBack(SeqList *pSL)
{
assert(pSL != NULL);
assert(pSL->size > 0);
pSL->size--;
}
>头删:从前往后依次覆盖前一个值,长度-1
void SeqListPopFront(SeqList *pSL)
{
assert(pSL);
assert(pSL->size > 0);
int pos;
for (pos = 1; pos < pSL->size; pos++)
{
pSL->array[pos - 1] = pSL->array[pos];
}
pSL->size--;
}
>按下标删除:
分两种情况:以要搬运的数值做循环指示和以要 搬运的位置做指示
void SeqListErase(SeqList *pSL, int pos)
{
assert(pSL);
assert(pSL->size > 0);
assert(pos >= 0 && pos < pSL->size);
//按下标删分两种情况
//第一种:以要搬运的数值做循环指示
#if 0
int p;
for (p = pos + 1; p < pSL->size; p++)
{
pSL->array[p - 1] = pSL->array[p];
}
#endif
//第二种:以要 搬运的位置做指示
#if 1
int p;
for (p = pos; p < pSL->size-1; p++)
{
pSL->array[p] = pSL->array[p+1];
}
#endif
pSL->size--;
}
>按值删除,只删除遇到的第一个:
void SeqListRemove(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
assert(pSL->size > 0);
int pos = SeqListFind(pSL, data); //调用查找元素函数
if (pos != -1){
SeqListErase(pSL, pos); //调用按下标删
}
}
>按值删除,删除所有:
用两个变量(i,j)来表示数组下标,i通过下标来判断是否是给定值,如果不是,则把i对应的下标元素放到下标j对应的位置。如果是则跳过,继续查找:如下图
void SeqListRemoveAll(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
assert(pSL->size > 0);
int i, j;
for (i = 0, j = 0; i < pSL->size;i++)
{
if (pSL->array[i]!= data)
{
pSL->array[j] = pSL->array[i];
j++;
}
}
pSL->size = j;
}
3.查找::返回第一个找到的下标,若没有则返回-1
int SeqListFind(SeqList *pSL, DataType data)
{
assert(pSL);
int pos;
for (pos = 0; pos < pSL->size - 1; pos++)
{
if (pSL->array[pos] == data)
return pos;
}
return -1;
}