01顺序表及其操作
01顺序表及其操作
1、顺序表结构体
typedef struct Vector { int *data; int size, length; // 顺序表的容量,顺序表的数组长度 }Vector;
2、顺序表初始化
Vector *init(int n) ,n为初始化顺序表的容量
Vector *init(int n) { Vector *vec = (Vector*)malloc(sizeof(Vector)); vec->data = (int *)malloc(sizeof(int) * n); vec->size = n; vec->length = 0; return vec; }
3、顺序表扩容
int expand(Vector *vec)
int expand(Vector *vec) { int extr_size = vec->size; int *p; while (extr_size) { p = (int*)realloc(vec->data, sizeof(int) * (vec->size + extr_size)); if (p) break; extr_size /= 2; } if (extr_size == 0) return 0; vec->data = p; vec->size += extr_size; return 1; }
4、插入元素
int insert(Vector *vec, int ind, int val) ,ind为出入的位置索引,val为插入的元素
int insert(Vector *vec, int ind, int val) { if (vec == NULL) return 0; if (ind < 0 || ind > vec->length) return 0; if (vec->length == vec->size) { if (!expand(vec)) return 0; printf("Success to expand! The Vector size is %d\n", vec->size); } int i; for (i=vec->length;i>ind;i--) { vec->data[i] = vec->data[i-1]; } vec->data[ind] = val; vec->length += 1; return 1; }
5、删除元素
int erase(Vector *vec, int ind) ,ind为要删除的元素的位置索引
int erase(Vector *vec, int ind) { if (vec == NULL) return 0; if (ind < 0 || ind > vec->length) return 0; int i; for (i=ind;i<vec->length-1;i++) { vec->data[i] = vec->data[i+1]; } vec->length -= 1; return 0; }
6、打印输出顺序表的元素
void output(Vector *vec)
void output(Vector *vec) { printf("Vector: ["); int i; for (i=0;i<vec->length;i++) { i && printf(", "); printf("%d", vec->data[i]); } printf("]\n"); return; }
7、删除顺序表
void clear(Vector *vec)
void clear(Vector *vec) { free(vec->data); free(vec); return; }
8、整体代码及测试代码
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Vector { int *data; int size, length; }Vector; Vector *init(int n) { Vector *vec = (Vector*)malloc(sizeof(Vector)); vec->data = (int *)malloc(sizeof(int) * n); vec->size = n; vec->length = 0; return vec; } int expand(Vector *vec) { int extr_size = vec->size; int *p; while (extr_size) { p = (int*)realloc(vec->data, sizeof(int) * (vec->size + extr_size)); if (p) break; extr_size /= 2; } if (extr_size == 0) return 0; vec->data = p; vec->size += extr_size; return 1; } int insert(Vector *vec, int ind, int val) { if (vec == NULL) return 0; if (ind < 0 || ind > vec->length) return 0; if (vec->length == vec->size) { if (!expand(vec)) return 0; printf("Success to expand! The Vector size is %d\n", vec->size); } int i; for (i=vec->length;i>ind;i--) { vec->data[i] = vec->data[i-1]; } vec->data[ind] = val; vec->length += 1; return 1; } int erase(Vector *vec, int ind) { if (vec == NULL) return 0; if (ind < 0 || ind > vec->length) return 0; int i; for (i=ind;i<vec->length-1;i++) { vec->data[i] = vec->data[i+1]; } vec->length -= 1; return 0; } void output(Vector *vec) { printf("Vector: ["); int i; for (i=0;i<vec->length;i++) { i && printf(", "); printf("%d", vec->data[i]); } printf("]\n"); return; } void clear(Vector *vec) { free(vec->data); free(vec); return; } int main() { srand(time(0)); #define max_op 20 Vector *vec = init(max_op); int i; for (i=0;i<max_op;i++) { int op = rand() % 4; int ind = rand() % (vec->length + 3) - 1; int val = rand() % 100; switch(op) { case 0: case 1: case 2: { printf("insert %d at %d to Vector = %d\n", val, ind, insert(vec, ind, val)); break; } case 3: { printf("erase an item at %d from Vector = %d\n", ind, erase(vec, ind)); break; } } output(vec); printf("\n"); } clear(vec); #undef max_op return 0; }
知行合一,
翻万卷书,游千里路,会百家才