首页 > 其他分享 >c语言实现vector及其相关函数(自存)

c语言实现vector及其相关函数(自存)

时间:2024-05-02 21:01:05浏览次数:22  
标签:elements capacity 函数 Vector int void vector 自存 size

#include<stdio.h>
#include <stdlib.h> 
#define PREALLOC_MAX 1024
#define DEFAULT_CAPACITY 8

typedef int E;

typedef struct {
    E* elements;   // 指向堆空间的数组
    int size;    // 元素的个数
    int capacity; // 数组的容量
} Vector;

void push_back(Vector* v, E val);
// 在数组最前面添加元素,所有元素依次后移
void push_front(Vector* v, E val);
// 删除最后一个元素, 并把最后一个元素返回
E pop_back(Vector* v);
// 删除第一个元素,并把第一个元素返回
E pop_front(Vector* v);
void grow_capacity(Vector* v);
Vector* vector_create(void);

int main(void){
    // Vector v1;
    Vector* v = vector_create();
   /* push_back(v, 1);
    push_back(v, 2);
    push_back(v, 3);*/
    push_front(v, 1);
    push_front(v, 2);
    push_front(v, 3);
    int pb = pop_front(v);
    printf("%d", pb);
    return 0;
}

void grow_capacity(Vector* v) {
    int new_capacity = v->capacity < PREALLOC_MAX ? v->capacity << 1 : v->capacity + PREALLOC_MAX;
    E* p = realloc(v->elements, new_capacity * sizeof(E));
    if (!p) {
        printf("ERROR:REALLOC FAILED IN REALLOC\n");
        exit(1);
    }
    v->elements = p;
    v->capacity = new_capacity;
}

Vector* vector_create(void) {
    Vector* v = malloc(sizeof(Vector));
    if (!v) {
        printf("Error: malloc failed in vector_create\n");
        exit(1);
    }
    E* p = malloc(DEFAULT_CAPACITY * sizeof(E));
    if (!p) {
        free(v);
        printf("Error: malloc failed in vector_create\n");
        exit(1);
    }
    v->elements = p;
    v->size = 0;
    v->capacity = DEFAULT_CAPACITY;
    return v;
}
void vector_destroy(Vector* v) {
    free(v->elements);
    free(v);
}

void push_back(Vector* v, E val) {
    //判断是否需要扩容
    if (v->size == v->capacity) {
        grow_capacity(v);
    }
    v->elements[v->size++] = val;
}

void push_front(Vector* v, E val) {
    //判断是否需要扩容
    if (v->size == v->capacity) {
        grow_capacity(v);
    }
    //把元素往后移动一位
    for (int i = v->size - 1; i >= 0; i--)
        v->elements[i+1] = v->elements[i];
    //在数组最前面添加元素
    v->elements[0] = val;
    v->size++;
}

E pop_back(Vector* v){
    //判断是否为空
    if (v->size == 0)
    {
        printf("error:vector size is %d!!!!", v->size);
        return -1;
    }
    //返回最后一个元素
    int latter = v->elements[v->size - 1];
    v->size--;
    return latter;
}
E pop_front(Vector* v) {
    //判断是否为空
    if (v->size == 0)
    {
        printf("error:vector size is %d!!!!", v->size);
        return -1;
    }
    int val = v->elements[0];
    for (int i = 1; i < v->size; i++)
    {
        v->elements[i-1] = v->elements[i];
    }
    v->size--;
    return val;
}

 

标签:elements,capacity,函数,Vector,int,void,vector,自存,size
From: https://www.cnblogs.com/Uiney117/p/18170560

相关文章

  • 【模板】生成函数 I
    多项式与形式幂级数多项式:\(A(x)=\sum\limits_{i=0}^{n}a_ix^i\)。形式幂级数:\(A(x)=\sum\limits_{i\ge0}a_ix^i\)。形式幂级数不用考虑其收敛域。形式幂级数(多项式)的运算设\(A(x)=\sum\limits_{i\ge0}a_ix^i,B(x)=\sum\limits_{i\ge0}b_ix^i\)。\(A(x)+B(x)=\sum\limits......
  • 二谈三角函数
    函数的性质可以通过图像来直观的看出。三角函数都是周期函数,因此三角函数的函数图像都是一段函数图像的循环。例如\(\sin{x}\)、\(\cos{x}\)和\(\tan{x}\),它们都以\(2\pi\)为周期。正弦函数\(\sin{x}\)和余弦函数\(\cos{x}\)的图像形状差不多,左右移动适当距离,就能使\(\si......
  • Oracle中sysdate函数的个别用法举例
    1.什么是sysdate在Oracle中sysdate是一个函数,可直接调用sysdate,返回运行数据库的操作系统的当前日期时间。注意:返回的日期时间值的格式取决于NLS_DATE_FORMAT参数的值。sysdate的单位是天。2.sysdate用法举例2.1sysdatesysdate-A型,这种结果是天数,代表往前推A天;SELECT......
  • 30 秒出服装设计稿,森马用函数计算+AIGC 整“新活”!
    创新项目如何去赋能我们的业务,这件事情在森马很重要。阿里云函数计算帮我们屏蔽掉了想把AI落地到实际业务场景中GPU算力资源储备、采购成本、技术门槛等很多难题,从而迅速做出决策,快人一步站在正确的起点,体验新技术对整个服装爆款设计、营销链路带来的改变。—— 林建霞 森马......
  • opencv距离变换函数distanceTransform
    当图像内的各个子图没有连接时,可以直接使用形态学的腐蚀操作确定前景对象,但是如果图像内的子图连接在一起时,就很难确定前景对象了。此时,借助于距离变换函数cv2.distanceTransform()可以方便地将前景对象提取出来。距离变换函数cv2.distanceTransform()计算二值图像内任意点到最......
  • 欧拉函数 整除分块 扩展欧几里得
    欧拉函数\(\varphi(x)\)表示求出\(1\ley\lex,\gcd(x,y)=1\)的\(y\)的数量。对于一个质数\(p\),\(\varphi(p)=p-1\)\(\varphi(p^2)=p^2-\frac{p^2}{p}=p^2-p\)\(\dots\)\(\varphi(p^i)=p^i-p^{i-1}=(p-1)\cdotp^{i-1}\)......
  • 欧拉函数
    欧拉函数\(phi_x\)表示\(1\)到\(x\)中的所有与\(x\)互质的数字数量性质:x为质数时,\(phi_x=x-1\),\(phi_{x^2}=p^2-p\),……\(phi_{x^k}=p^k-p^{k-1}=(p-1)\timesp^{k-1}\)当\(a,b\)互质时,\(phi_{a\timesb}=phi_a*phi_b\)做法:......
  • JavaScript函数
    JavaScript函数函数就是一些功能或语句的封装。在需要的时候,通过调用的形式,执行这些语句。函数也是一个对象函数定义我们使用function关键字定义函数,中文含义是“函数”、“功能”。可以使用如下方式进行定义。函数声明使用函数声明来创建一个函数。语法:function函数名([形......
  • python匿名函数、内置函数以及各类高阶函数等
    【一】匿名函数【1】函数的分类#【1】正规函数deflogin():...login()#【2】匿名函数(无名函数)#语法:lambda参数:表达式#lambda:匿名函数的关键字#参数可以放位置参数以及关键字参数...#表达式:其实本质上是返回值【2】定义匿名函数Python使用lamb......
  • 一文详解C++的vector
    vector是C++中使用频率最高的标准库,可以在程序运行时动态改变其大小(例如添加或删除元素),因此又被称为动态数组。使用时,用户无需在意底层内存管理的细节,因为它已经帮你做了这件事情。使用前需要导入<vector>头文件,以下是vector的常见用法:1.创建vectorvector用于保存一组同类型的......