【C语言刷题家中常备的轮子】C语言简略版的向量Vector以及嵌套二维向量

前言

在LeetCode用C语言刷题太痛苦了,二叉树章节老是让返回什么二维数组之类,然后还要返回不同的维度,干脆直接模拟C++的Vector,其中二维Vector中加了一个转换为二维数组和返回每一行向量维度数组的函数。

C语言版Vector

#include 
#include
typedef int ElemType;
//动态顺序表结构体(C语言版Vector)
typedef struct Vector {
    int len;//顺序表长度,也充当栈顶指针的作用len-1就是数组最后一个元素
    ElemType* data;//存储顺序表的数组
}Vector;
//创建动态顺序表
Vector* createVector()
{
    Vector* L = (Vector*)malloc(sizeof(Vector));
    L->len = 0;
    L->data = NULL;
    return L;
}
//动态顺序表尾插
void push_backVector(Vector* L, ElemType val)
{
    //最开始顺序表为空,则要为其创建空间,让元素插入
    if (L->data == NULL)
    {
        L->len++;
        L->data = (ElemType*)malloc(L->len * sizeof(ElemType));
        L->data[L->len - 1] = val;
        return;
    }
    //其他情况,先用p指针记录旧数组,为新数组开辟空间,依次将就旧数组拷贝到新空间,新空间比原空间多一个,长度增加
    L->len++;
    ElemType* p = L->data;
    L->data = (ElemType*)malloc(L->len * sizeof(ElemType));
    //拷贝旧空间值
    for (int i = 0; i < L->len - 1; i++)
    {
        L->data[i] = p[i];
    }
    L->data[L->len - 1] = val;
    //释放旧空间
    free(p);
    return;
}
//删除动态顺序表最后一个元素
ElemType pop_backVector(Vector* vec)
{
    //空无法删除
    if (vec->len == 0)
    {
        return INT_MIN;
    }
    //其他情况,先取出被删除元素
    ElemType r = vec->data[vec->len - 1];
    vec->len--;//长度减1
    ElemType* p = vec->data;
    vec->data = (ElemType*)malloc((vec->len) * sizeof(ElemType));//创建一个比之前小的数组
    //拷贝旧元素
    for (int i = 0; i < vec->len; i++)
    {
        vec->data[i] = p[i];
    }
    free(p);//释放空间
    return r;
}
//清空顺序表
void clearVector(Vector* vec)
{
    int* p = vec->data;
    vec->data = NULL;
    vec->len = 0;
    free(p);
}

C语言版二维Vector(Vector嵌套)

//二维Vector(Vector嵌套的情况)
typedef struct DouVector
{
    int size;//存了多少个一维Vector
    Vector** data;//数据域
}DouVector;
//创建二维Vector
DouVector* createDouVector()
{
    DouVector* dvec = (DouVector*)malloc(sizeof(DouVector));
    dvec->size = 0;
    dvec->data = NULL;
    return dvec;
}
//向二维Vector中尾插一个一维Vector
void push_backDouVector(DouVector* dvec, Vector* vec)
{
    //最开始顺序表为空,则要为其创建空间,让元素插入
    if (dvec->data == NULL)
    {
        dvec->size++;
        dvec->data = (Vector**)malloc(dvec->size * sizeof(Vector*));
        dvec->data[dvec->size - 1] = vec;
        return;
    }
    //其他情况,先用p指针记录旧数组,为新数组开辟空间,依次将就旧数组拷贝到新空间,新空间比原空间多一个,长度增加
    dvec->size++;
    Vector** p = dvec->data;
    dvec->data = (Vector**)malloc(dvec->size * sizeof(Vector*));
    //拷贝旧空间值
    for (int i = 0; i < dvec->size-1; i++)
    {
        dvec->data[i] = p[i];
    }
    dvec->data[dvec->size - 1] = vec;
    //释放旧空间
    free(p);
    return;
}
//删除二维Vector的最后一维行向量
Vector* pop_backDouVector(DouVector* dvec)
{
    //空无法删除
    if (dvec->size == 0)
    {
        return INT_MIN;
    }
    //其他情况,先取出被删除元素
    Vector* r = dvec->data[dvec->size - 1];
    dvec->size--;//长度减1
    Vector** p = dvec->data;
    dvec->data = (Vector**)malloc((dvec->size) * sizeof(Vector*));//创建一个比之前小的数组
    //拷贝旧元素
    for (int i = 0; i < dvec->size; i++)
    {
        dvec->data[i] = p[i];
    }
    free(p);//释放空间
    return r;
}
//重要:将二维Vector转换为二维数组(行数对应一维Vector的数量,列数对应每个一维Vector的长度)
ElemType** douVectorToDouArr(DouVector* dvec)
{
    //没有Vector返回空
    if (dvec->size == 0)
    {
        return NULL;
    }
    ElemType** arr = (ElemType**)malloc((dvec->size)*sizeof(ElemType*));
    //给每行设置成对应的Vector
    for (int i = 0; i < dvec->size; i++)
    {
        arr[i] = dvec->data[i]->data;
    }
    return arr;
}
//重要:将二维Vector每一行向量的维度返回到一个数组中
int* getDemDouVector(DouVector* dvec)
{
    //二维Vector为空,返回NULL
    if (dvec->size == 0)
    {
        return NULL;
    }
    int* p = (int*)malloc((dvec->size) * sizeof(int));
    for (int i = 0; i < dvec->size; i++)
    {
        p[i] = dvec->data[i]->len;
    }
    return p;
}
//清空二维Vector
void clearDouVector(DouVector* dvec)
{
    Vector** p = dvec->data;
    dvec->data = NULL;
    dvec->size = 0;
    free(p);
}

你可能感兴趣的:(C语言刷题辅助,c语言,算法,开发语言)