| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| ① | ② | ③ | ④ | ⑤ | ⑥ | ⑦ | ⑧ | ⑨ |
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct vector {
int size, count;
int *data;
} vector;
// 创建
vector *getNewVector(int n) {
vector *p = (Vector *)malloc(sizeof(vector));
p->size = n;
p->count = 0;
p->data = (int *)malloc(sizeof(int) * n);
return p;
}
// 扩容
int expand(vector *v) {
if (v == NULL) return 0;
printf("expand v from %d to %d\\n", v->size, 2 * v->size);
int *p = (int *)realloc(v->data, sizeof(int) * 2 * v->size);
if (p == NULL) return 0;
v->data = p;
v->size *= 2;
return 1;
}
// 插入
int insert(vector *v, int pos, int val) {
if (pos < 0 || pos > v->count) return 0;
if (v->size == v->count && !expand(v)) return 0;
for (int i = v->count - 1; i >= pos; i--) {
v->data[i + 1] = v->data[i];
}
v->data[pos] = val;
v->count += 1;
return 1;
}
// 删除
int erase(vector *v, int pos) {
if (pos < 0 || pos >= v->count) return 0;
for (int o = pos + 1; i < v->count; i++) {
v->data[i - 1] = v->data[i];
}
v->count -= 1;
return 1;
}
// 打印
void output_vecotr(vector *v) {
int len = 0;
for (int i = 0; i < v->size; i++) {
len += printf("%3d", i);
}
printf("\\n");
for (int i = 0; i < len; i++) printf("-");
printf("\\n");
for (int i = 0; i < v->count; i++) {
printf("%3d", v->data[i]);
}
printf("\\n\\n\\n");
return;
}
// 释放
void clear(vector *v) {
if (v == NULL) return;
free(v->data);
free(v);
return;
}
int main() {
srand(time(0));
#define MAX_OP 20
vector *v = getNewVecotr(MAX_OP);
for (int i = 0; i < MAX_OP; i++) {
int op = rand() % 4, pos, val, ret;
switch (op) {
case 0:
case 1:
case 2:
pos = rand() % (v->count + 2);
val = rand() % 100;
ret = insert(v, pos, val);
printf("insert %d at %d to vector = %d\\n",
val, pos, ret);
break;
case 3:
pos = rand() % (v->count + 2);
ret = erase(v, pos);
printf("erase item at %d in vector = %d\\n",
pos, ret);
break;
}
output_vecotr();
}
return 0;
}
结构定义:
结构操作:
无头链表和有头链表:
有头链表的头部节点称为虚拟头节点。