顺序表实现

/*************************************************************************
	> 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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值