程序代码
自定义实现顺序表 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]
结论
代码示例,有问题留言。