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