数据结构 = 结构定义 + 结构操作
cppreference
https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5
顺序表 - 线性结构:一对一
1.什么是顺序表? 是一个更高级的数组
结构定义:
一片连续存储空间
可以存储任意类型值 (类型需要一致,int、char、结构体…) (data_type)
顺序表大小 (size)
顺序表以存储个数 (length)
结构操作:
插入元素 (insert)
如果第一个满足只执行1
不满足可以直接执行 2
可以通过整理 直接用2
来实现
- 如果代插入数据
i
等于i == length
那么直接在后面添加length++
- 在待插入位置
i
把i + 1
后数据全部向后移动一位,并且legth++
删除元素 (clear)
- 待删位置
i
把i + 1
之后位置的数据向前移动一位 覆盖掉 length--
新知识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdlib.h> // malloc 需要头文件 #include <stdio.h> #demine MAX_N 20
int main() { int *v = (int *) malloc(sizeof(int) * MAX_N); free(v); v = NULL; int *v1 = (int *) calloc(20, MAX_N * sizeof(int)); free(v); v = NULL; int *v = (int *) malloc(sizeof(int) * MAX_N); v = (int *) realloc (v, 5 * sizeof(int) * MAX_N); free(v); v = NULL; return 0; }
|
代码演示-顺序表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#include <stdio.h> #include <stdlib.h> #include <time.h>
#define COLOR(a, b) "\033[" #b "m" a"\033[0m"
#define GREEN(a) COLOR(a, 32) #define RED(a) COLOR(a, 31)
typedef int Type;
typedef struct Vector { Type *data; int size, length; } Vec;
Vec *init(int n) { Vec *v = (Vec *)malloc(sizeof(Vec)); v->data = (Type *)malloc(sizeof(Type) * n); v->size = n; v->length = 0; return v; }
void clear(Vec *v) { if(v == NULL) return ; free(v->data); free(v); return ; }
int expand(Vec *v) { int extr_size = v->size; Type *p; while(extr_size) { p = (Type *)realloc(v->data, sizeof(Type) * (v->size + extr_size)); if(p != NULL) break; extr_size >>= 1; } if(p == NULL) { printf(RED("扩容失败\n")); return 0; } v->size += extr_size; v->data = p; printf(GREEN("当前容量 : %d -- 扩容到 : %d\n"), v->size - extr_size, v->size); return 1; }
int insert(Vec *v, int ind, Type val) { if(v == NULL) return 0; if(ind < 0 || ind > v->length) return 0; if(v->length == v->size) { if(!expand(v)) return 0; } 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 + 1; i < v->length; i++) { v->data[i - 1] = v->data[i]; } v->length--; return 1; }
void output(Vec *v) { if(v == NULL) return ; printf("Vector(%d) :[", v->length); for(int i = 0; i < v->length; i++) { i && printf(","); printf("%d", v->data[i]); } printf("]\n"); return ; }
int main() { #define MAX_N 20 Vec *v = init(1); srand(time(0)); for(int i = 0; i < MAX_N; i++) { int op = rand() % 2; int ind = rand() % (v->length + 3) - 1; int val = rand() % 100; switch(op) { case 0: printf("insert %d at %d to Vector = %d \n", val, ind, insert(v, ind, val)); break; case 1: printf("erase a iterm at %d from Vector = %d\n", ind, erase(v, ind)); break; } output(v), printf("\n"); } clear(v); #undef MAX_N return 0; }
|