C语言之 动态顺序表(Dynamic Sequence Table)

目录

1、顺序表的创建

2、接口函数的声明

3、初始化

4、销毁顺序表

5、找x,找到返回下标,未找到返回-1

6、指定pos位置插入x

7、删除pos位置的数据

8、尾插数据

9、打印顺序表

10、检查并扩容

11、尾删数据

12、头插数据

13、头删数据


1、顺序表的创建

typedef int SLDataType;    
typedef struct SeqList
{
    SLDataType* a;
    int size; 
    int capacity;    // 数组实际能存储的空间容量是多少个
}SL;

2、接口函数的声明

void SeqListInit(SL *ps);        // 初始化顺序表
    // 形参 是实参的临时拷贝,不会影响实参 - 传值操作
    //           所以传地址
void SeqListDestory(SL* ps);    // 使用完后销毁,防止内存泄露
void SeqListCheckCapacity(SL* ps);    //    检查容量+扩容
void SeqListPrint(SL* ps);            //    打印数据
void SeqListPushBack(SL* ps, SLDataType x);    //    尾插
void SeqListPopBack(SL* ps);    // 尾删            
void SeqListPushFront(SL* ps, SLDataType x); // 头插
void SeqListPopFront(SL* ps);                //  头删
int SeqListFind(SL* ps, SLDataType x);    // 找到x返回下标,未找到返回-1
void SeqListInsert(SL* ps, int pos, SLDataType x);    // 指定pos位置插入x
void SeqListErase(SL* ps, int pos);        //    删除pos位置的数据

3、初始化

void SeqListInit(SL*ps)
{
    ps->a = NULL;
    ps->size = ps->capacity = 0;
}

4、销毁顺序表

void SeqListDestory(SL* ps)
{
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->size = 0;
}

5、找x,找到返回下标,未找到返回-1

int SeqListFind(SL* ps, SLDataType x)
{
    int begin = 0;
    while (begin++ <= ps->size)
    {
        if (ps->a[begin] == x)
            return begin;
    }
    return -1;
}


6、指定pos位置插入x

void SeqListInsert(SL* ps, int pos, SLDataType x)
{
    assert(pos <= ps->size && pos >= 0);
    // 判断+扩容
    SeqListCheckCapacity(ps);
    // 挪动数据,从后往前
    int end = ps->size - 1;
    while (end >= pos)
    {
        ps->a[end + 1] = ps->a[end];
        end--;
    }
    // 插入数据
    ps->a[pos] = x;
    ps->size++;
}

7、删除pos位置的数据

void SeqListErase(SL* ps, int pos)
{
    assert(pos < ps->size && pos >= 0);

    int begin = pos + 1;
    while (begin < ps->size) 
    {
        ps->a[begin - 1] = ps->a[begin];
        begin++;
    }
    ps->size--;
}

8、尾插数据

void SeqListPushBack(SL* ps, SLDataType x)
{
    SeqListInsert(ps, ps->size, x);
}

9、打印顺序表

void SeqListPrint(SL* ps)
{
    int i = 0;
    for (i; i < ps->size; i++)
    {
        printf("%d ", ps->a[i]);
    }
    printf("\n");
}

10、检查并扩容

void SeqListCheckCapacity(SL* ps)
{
    //  如果没有空间(0个)或空间不足(满了)
    if (ps->size == ps->capacity)
    {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        //  三目操作符 是否等于0,是给4,否则给2倍原空间
        SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newcapacity);
        //    开辟空间
        if (tmp == NULL)
        {
            printf("realloc fail\n");
            exit(-1);    // 异常终止程序
        }
        ps->a = tmp;    //    开辟的空间给结构体
        ps->capacity = newcapacity;// 开辟的大小给原大小
    }
}

11、尾删数据

void SeqListPopBack(SL* ps)
{
    SeqListErase(ps, ps->size-1);
}

12、头插数据

void SeqListPushFront(SL* ps, SLDataType x)
{
    SeqListInsert(ps, 0, x);
}

13、头删数据

void SeqListPopFront(SL* ps)
{
    SeqListErase(ps, 0);
}

你可能感兴趣的:(算法,c语言,数据结构)