【C】自定义实现顺序表 vector 插入、删除和扩容(code c)


程序代码

自定义实现顺序表 vector 插入、删除和扩容 code c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct Vector {
    int *data;
    int size, length;
} Vec;

Vec *init(int n) {
    Vec *v = (Vec *)malloc(sizeof(Vec));
    v->data = (int *)malloc(sizeof(int) * n);
    v->size = n;
    v->length = 0;
    return v;
}

int expand(Vec *v) {
    int extr_size = v->size;
    int *p;
    while (extr_size) {
        p = (int *)realloc(v->data, sizeof(int) * (v->size + extr_size));
        if (p) break;
        extr_size >>= 1;
    }
    if (p == NULL) return 0;
    v->data = p;
    v->size += extr_size;
    return 1;
}

int insert(Vec *v, int ind, int val) {
    if (v == NULL) return 0;
    if (ind < 0 || ind > v->length) return 0;
    if (v->length == v->size) {
        if (!expand(v)) return 0;
        printf("------------------------------------\n");
        printf("success to expand, the new size = %d\n", v->size);
        printf("------------------------------------\n\n");
    }
    for (int i = v->length; i > ind; --i) {
        v->data[i] = v->data[i - 1];
    }
    v->data[ind] = val;
    v->length += 1;
    return 1;
}

int erase(Vec *v, int ind) {
    if (v == NULL) return 0;
    if (ind < 0 || ind >= v->length) return 0;
    for (int i = ind; i < v->length; ++i) { // 边界多1位,默认值覆盖
        v->data[i] = v->data[i + 1]; 
    }
    v->length -= 1;
    return 1;
}

void output(Vec *v) {
    printf("Vec : [");
    for (int i = 0; i < v->length; ++i) {
        i && printf(",");
        printf("%d", v->data[i]);
    }
    printf("]\n");
    return ;
}

void clear(Vec *v) {
    if (v == NULL) return ;
    free(v->data);
    free(v);
    return ;
}

int main() {
    #define MAX_N 4
    srand(time(0));
    Vec *v = init(MAX_N);
    for (int i = 0; i < 5 * MAX_N; ++i) {
        int op = rand() % 4;
        int val = rand() % 100;
        int ind = rand() % (v->length + 3) - 1;
        switch (op) {
            case 0:
            case 1:
            case 2: {
                printf("insert %d at %d, return %d (1true, 0false)\n", val, ind, insert(v, ind, val)); 
            } break;
            case 3: {
                printf("erase a integer at %d, return %d (1true, 0false)\n", ind, erase(v, ind));
            } break;
        }
        output(v), printf("\n");
    }
    #undef MAX_N
    clear(v);
    return 0;
}

运行结果

insert 90 at -1, return 0 (1true, 0false)
Vec : []

erase a integer at 1, return 0 (1true, 0false)
Vec : []

insert 67 at 0, return 1 (1true, 0false)
Vec : [67]

erase a integer at -1, return 0 (1true, 0false)
Vec : [67]

erase a integer at 0, return 1 (1true, 0false)
Vec : []

insert 81 at 1, return 0 (1true, 0false)
Vec : []

erase a integer at 1, return 0 (1true, 0false)
Vec : []

erase a integer at 1, return 0 (1true, 0false)
Vec : []

insert 84 at -1, return 0 (1true, 0false)
Vec : []

insert 91 at 0, return 1 (1true, 0false)
Vec : [91]

insert 61 at 1, return 1 (1true, 0false)
Vec : [91,61]

insert 13 at 3, return 0 (1true, 0false)
Vec : [91,61]

insert 18 at 0, return 1 (1true, 0false)
Vec : [18,91,61]

erase a integer at 1, return 1 (1true, 0false)
Vec : [18,61]

erase a integer at 1, return 1 (1true, 0false)
Vec : [18]

insert 74 at 1, return 1 (1true, 0false)
Vec : [18,74]

insert 69 at 2, return 1 (1true, 0false)
Vec : [18,74,69]

insert 53 at 2, return 1 (1true, 0false)
Vec : [18,74,53,69]

------------------------------------
success to expand, the new size = 8
------------------------------------

insert 78 at 0, return 1 (1true, 0false)
Vec : [78,18,74,53,69]

insert 88 at 4, return 1 (1true, 0false)
Vec : [78,18,74,53,88,69]

结论

代码示例,有问题留言。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idiot5liev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值