/*************************************************************************
> File Name: src/Vector.c
> Author: yanqi
> Mail: blyanqi@163.com
> Created Time: Sat Apr 9 03:41:26 2022
************************************************************************/
#include<stdio.h>
#include<malloc.h>
#include "../include/vector.h"
/**
* 初始化顺序表
*/
Vector * initVector(int cap){
// 分配对象大小
Vector *v = (Vector *) malloc(sizeof(Vector));
// 分配数据区大小
v->data = (int *) malloc(sizeof(int)*cap);
// 容量
v->cap = cap;
// 当前长度
v->len = 0;
return v;
}
/**
* 释放堆空间
*/
void freeVector(Vector *v){
// 释放数据
free(v->data);
// 释放顺序表
free(v);
}
/**
* 扩容
*/
int expand(Vector *v){
// 获取当前容量
int excap=v->cap;
// 设置扩容的大小
int * tmp;
// 保证扩容成功
while(excap){
// 当前容量+ 扩容的容量,realloc 会把原有的数据进行复制
tmp = (int *)realloc(v->data,sizeof(int)*(v->cap+excap));
// 扩容成功
if(tmp) break;
// 缩小一半,继续尝试
excap>>=1;
}
// 扩容失败
if(!tmp) return 0;
// 设置新的数据区
v->data=tmp;
// 设置新的容量
v->cap+=excap;
return 1;
}
/**
* 插入
*/
void insert(Vector * v,int idx,int value){
if(!v) return;
// 索引必须有效
if(idx > v->len || idx < 0) return;
// 长度达到容量则触发扩容
if(v->len == v->cap){
if(!expand(v)) return;
};
// 移动数据,len 为空值
for(int i=v->len;i > idx;i--){
v->data[i]=v->data[i-1];
}
// 赋值
v->data[idx]=value;
// 增加长度
v->len++;
}
/**
* 删除
*/
void delete(Vector *v,int idx){
if(!v) return ;
if(idx >= v->len || idx<0) return ;
// 移动数据
for(int i=idx;i < v->len;i++){
v->data[i]=v->data[i+1];
}
// 减少长度
v->len--;
}
/**
* 遍历
*/
void printVector(Vector *v){
// 打印当前长度,容量
printf("length: %d cap: %d \n",v->len,v->cap);
// 遍历数据
for(int i=0;i<v->len;i++){
printf("%d ",v->data[i]);
}
printf("\n----------------------\n");
}