大家有没有发现上次静态顺序表有一定的缺陷,它会浪费很多的空间,比如我们只有10个元素但我们申请元素申请100个,这样我们会浪费90个空间,而动态顺序表我们插入多少个我们就申请多少个,大大的节省了我们大的空间。
首先我们来看看动态顺序表的结构:
typedef struct deqlist { Datatype *array; int size; int capacity; }Deqlist;
size是有效元素的个数,capacity是最大存储长度
当size大于等于capacity时,我们就进行扩容。
//拓展动态顺序表 void explanddeqlist(Deqlist *L) { assert(L); if (L->size >= L ->capacity) { L->capacity = L->capacity * 2; Datatype *newarray = (Datatype*)malloc(L->capacity*sizeof(Datatype));//创建新的指针 memcpy(newarray, L->array, L->size*sizeof(Datatype));//函数拷贝,将array所有数据拷贝L->size*sizeof(Datatype)个字节 L->array = newarray; } }
1.尾增(时间复杂度O(1))
void pushback(Deqlist *L, Datatype data) { assert(L); explanddeqlist(L); L->array[L->size++] = data; }
2.尾删(时间复杂度O(1))
void popback(Deqlist *L) { assert(L); if (L->size > 0) { L->size--; } }
3.头增(时间复杂度O(n))
void pushfront(Deqlist *L,Datatype data) { assert(L); explanddeqlist(L); int i = 0; for (i = L->size; i <= 0; i--) { L->array[i] = L->array[i - 1]; } L->array[0] = data; L->size++; }
4.头删(时间复杂度O(n))
void popfront(Deqlist *L) { assert(L); int i = 0; for (i = 1; i < L->size; i++) { L->array[i-1] = L->array[i]; } L->size--; }
我们来看看所有代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> typedef int Datatype; #define SIZE__ 10 typedef struct deqlist { Datatype *array; int size; int capacity; }Deqlist; //打印数组 void printdeqlist(Deqlist*L) { assert(L); int i = 0; for (i = 0; i < L->size; i++) { printf(" %d", L->array[i]); } printf("\n"); } //动态顺序表初始化 void initdeqlist(Deqlist *L) { assert(L); L->array = (Datatype *)malloc(SIZE__*sizeof(Datatype)); L->size = 0; L->capacity = SIZE__; } //拓展动态顺序表 void explanddeqlist(Deqlist *L) { assert(L); if (L->size >= L ->capacity) { L->capacity = L->capacity * 2; Datatype *newarray = (Datatype*)malloc(L->capacity*sizeof(Datatype)); memcpy(newarray, L->array, L->size*sizeof(Datatype)); L->array = newarray; } } //尾增 void pushback(Deqlist *L, Datatype data) { assert(L); explanddeqlist(L); L->array[L->size++] = data; } //尾删 void popback(Deqlist *L) { assert(L); if (L->size > 0) { L->size--; } } //头增 void pushfront(Deqlist *L,Datatype data) { assert(L); explanddeqlist(L); int i = 0; for (i = L->size; i <= 0; i--) { L->array[i] = L->array[i - 1]; } L->array[0] = data; L->size++; } //头删 void popfront(Deqlist *L) { assert(L); int i = 0; for (i = 1; i < L->size; i++) { L->array[i-1] = L->array[i]; } L->size--; } int main() { Deqlist L; initdeqlist(&L); pushback(&L, 5); pushback(&L, 1); pushback(&L, 2); pushback(&L, 3); pushback(&L, 4); popback(&L); pushfront(&L, 10); popfront(&L); printdeqlist(&L); system("pause"); return 0; }