#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
////静态扩容
//typedef struct SepList{
// int array[100];
// int size;
//}SeqList;
//动态扩容,我们只考虑动态扩容。
typedef struct SepList{
int* array;
int size;
int capcity;
}SeqList;
//此函数只存在内部链接属性,不存在外部链接属性
static void CheckCapcity(SeqList* ps){
if (ps->size<ps->capcity){
return;
}
int newcapcity = 2 * ps->capcity;
int* newarray = (int*)malloc(sizeof(int)*newcapcity);
assert(newarray != NULL);
for (int i = 0; i < ps->size; ++i){
newarray[i] = ps->array[i];
}
//释放老空间 ,绑定新空间
free(ps->array);
ps->array = newarray;
ps->capcity = newcapcity;
}
//顺序表的初始化
void SeqListInit(SeqList* ps, int capcity){
//ps期望是变量的地址
assert(ps != NULL);
ps->array = (int*)malloc(sizeof(int)*capcity);
assert(ps->array != NULL);
ps->size = 0;
ps->capcity = capcity;
}
//顺序表的销毁
void SeqlistDestroy(SeqList* ps){
assert(ps != NULL);
assert(ps->array != NULL);
//释放空间
free(ps->array);
//锦上添花
ps->array = NULL;
ps->capcity = 0;
ps->size = 0;
}
//o(1)
//顺序表的尾插
void SeqListPushBack(SeqList* ps, int v){
CheckCapcity(ps);
ps->array[ps->size] = v;
ps->size++;
}
//o(n)
//顺序表的头插
void SeqListPushFront(SeqList* ps, int v){
CheckCapcity(ps);
for (int i = ps->size - 1; i >= 0; --i){
ps->array[i + 1] = ps->array[i];
}
ps->array[0] = v;
ps->size++;
}
//顺序表的在pos下表下的插入
void SeqListInsert(SeqList* ps, int pos, int v){
assert(pos >= 0 && pos <= ps->size);
//在这里有两种办法
//1,用空间下表表示数据下表
//2,或用数据下表表示空间下表
for (int i = ps->size - 1; i >= pos; ++i){
ps->array[i + 1] = ps->array[i];
}
ps->array[pos] = v;
ps->size++;
}
//尾删
SeqListPopBack(SeqList* ps){
assert(ps->size>0);
ps->size--;
}
//头删
SeqListPopFront(SeqList* ps){
assert(ps->size>0);
for (int i = 1; i <= ps->size - 1; ++i){
ps->array[i - 1] = ps->array[i];
}
ps->size--;
}
//查找
int SeqListFind(SeqList* ps, int v){
for (int i = 0; i < ps->size; ++i){
if (ps->array[i] == v){
return i;
}
}
return -1;
}
//更新
void SeqListErase(SeqList *ps, int pos) {
// [0, size - 1]
assert(pos >= 0 && pos < ps->size);
for (int i = pos + 1; i < ps->size; i++) {
ps->array[i - 1] = ps->array[i];
}
ps->size--;
}
//修改
void SeqListModify(SeqList* ps, int v, int pos){
assert(pos >= 0 && pos < ps->size);
ps->array[pos] = v;
}
//删除第一个遇到 v的
void SeqListRemove(SeqList* ps, int v){
int pos = SeqListFind(ps, v);
if (pos == -1){
return;
}
SeqListErase(ps,pos);
}
//删除所有出现的 v
void SeqListRemoveAll(SeqList* ps, int v){
int i, j;
for (i = 0, j = 0; i < ps->size; ++i){
if (ps->array[i] != v){
ps->array[j] = ps->array[i];
j++;
}
}
ps->size = j;
}
//遍历
void SeqListTraverse(SeqList* ps){
assert(ps!=NULL);
for (int i = 0; i < ps->size;++i){
printf("%d ",ps->array[i]);
}
}
int main(){
SeqList SeqList;
SeqListInit(&SeqList, 100);
//尾插
SeqListPushBack(&SeqList, 1);
SeqListPushBack(&SeqList, 2);
SeqListPushBack(&SeqList, 3);
SeqListPushBack(&SeqList, 4);
SeqListPushBack(&SeqList, 3);
//头插
SeqListPushFront(&SeqList, 10);
SeqListPushFront(&SeqList, 20);
SeqListPushFront(&SeqList, 30);
SeqListPushFront(&SeqList, 40);
//头删
SeqListPopBack(&SeqList);
//尾删
SeqListPopFront(&SeqList);
//查找 2
printf("%d\n",SeqListFind(&SeqList,2));
//删除所有出现 3的数
SeqListRemoveAll(&SeqList,3);
//遍历
SeqListTraverse(&SeqList);
system("pause ");
return 0;
}
顺序表的 ‘’ 增删改查‘’
猜你喜欢
转载自blog.csdn.net/qq_43692920/article/details/88634685
今日推荐
周排行