动态数组
前言:
1.动态数组:malloc分配的连续存储单元,容量不足时可扩容。
2.含有函数:初始化,销毁,判空,判满,扩容,批量录入数据,查找,表尾追加,插入,删除,打印。
3.重点理解:如何通过移动元素在数组中实现删除或插入。
初稿:2017-11-18 21:31:05
1 #include"头文件.h" 2 #define INIT_SIZE 100 3 #define INCREMENT 10 4 typedef struct { 5 char *base;//基地址 6 int count;//数组元素个数 7 int size;//数组容量 8 }SeqList; 9 /* 10 **功能:初始化顺序表 11 **传入参数:顺序表(引用+特征)参数结构体 12 */ 13 void InitList(SeqList *L) { 14 (*L).base = (char*)malloc(sizeof(char)*INIT_SIZE); 15 if (!(*L).base) exit(-1); 16 (*L).count = 0;//初始数组内无元素 17 (*L).size = INIT_SIZE;//有INIT_SIZE个单元,即容量 18 } 19 /*功能:销毁顺序表 20 **传入:顺序表(引用+特征)参数结构体 21 */ 22 void DestroyList(SeqList *L) { 23 free((*L).base);//malloc分配的顺序表被释放 24 (*L).base = null;//指向顺序表的指针置空 25 (*L).size = 0; 26 (*L).count = 0; 27 } 28 /*功能:清空顺序表 29 **传入:顺序表(引用+特征)参数结构体 30 */ 31 void ClearList(SeqList *L) { 32 (*L).count = 0;//数组内没有元素 33 } 34 /*判断“数组”是否为空*/ 35 bool IsEmpty(SeqList *L) { 36 return (*L).count == 0 ? true : false; 37 } 38 /*判断“数组”是否已满*/ 39 bool IsFull(SeqList *L) { 40 return (*L).count == (*L).size ? true : false; 41 } 42 /*当数组容量不足时,扩容*/ 43 void Increment(SeqList *L) { 44 (*L).base = (char*)realloc((*L).base, (*L).size + INCREMENT); 45 if (!(*L).base) exit(-1); 46 (*L).size = (*L).size + INCREMENT; 47 } 48 /*批量录入数据*/ 49 void CreateList(SeqList *L) { 50 char data; 51 while (scanf_s("%c", &data), data != '#') { 52 if (IsFull(L)) Increment(L);//如果数组已满,扩容 53 (*L).base[(*L).count++] = data; 54 } 55 } 56 /*功能:查找第一个在顺序表出现的value,找到返回value在“数组”中的位置(>0) 57 **找不到,返回0 58 **传入:顺序表(引用+特征)参数结构体,要查找的元素value 59 */ 60 int Search(SeqList *L, char value) { 61 int i; 62 for (i = 0; i < (*L).count && (*L).base[i] != value; ++i); 63 if (i == (*L).count) return 0; 64 else return i + 1; 65 } 66 /*在顺序表尾追加元素value*/ 67 void AddTo(SeqList *L, char value) { 68 if (IsFull(L)) Increment(L); 69 (*L).base[(*L).count++] = value; 70 } 71 /*在第pos个位置插入元素value*/ 72 void Insert(SeqList *L, char value, int pos) { 73 if ((pos <= 0 || pos > (*L).count + 1)) { 74 printf("位置参数不合法!\n"); 75 return; 76 } 77 if (IsFull(L)) Increment(L);//数组容量不足,扩容 78 if (pos == (*L).count + 1) 79 AddTo(L, value);//插入位置是最后一个元素的位置后,调用追加函数 80 else { 81 for (int i = (*L).count - 1; i >= pos - 1; --i) { 82 (*L).base[i + 1] = (*L).base[i]; 83 } 84 (*L).base[pos - 1] = value; 85 ++(*L).count; 86 } 87 } 88 /*删除指定元素value*/ 89 void Remove(SeqList *L, char value) { 90 int pos = Search(L, value); 91 if (pos == 0) 92 printf("无此元素!\n"); 93 else { 94 for (int i = pos; i < (*L).count; ++i) 95 (*L).base[i - 1] = (*L).base[i]; 96 --(*L).count; 97 } 98 } 99 /*打印数组*/ 100 void Print(SeqList *L) { 101 if ((*L).base == null) { 102 printf("This SeqList is empty !"); 103 return; 104 } 105 for (int i = 0; i < (*L).count; ++i) 106 printf("%c ", (*L).base[i]); 107 printf("\n"); 108 } 109 110 int main() { 111 SeqList L; 112 InitList(&L); 113 printf("请输入数据:\n"); 114 CreateList(&L); 115 printf("打印数组如下:\n"); 116 Print(&L); 117 char tmp; 118 printf("请输入您要追加的元素:\n"); 119 fflush(stdin); 120 scanf_s("%c", &tmp); 121 AddTo(&L, tmp); 122 printf("在第1个位置插入A:\n"); 123 Insert(&L, 'A', 1); 124 printf("请输入您要删除的元素:"); 125 fflush(stdin); 126 scanf_s("%c", &tmp); 127 Remove(&L, tmp); 128 printf("打印数组如下:\n"); 129 Print(&L); 130 if (IsEmpty(&L)) 131 printf("数组是空的!\n"); 132 else { 133 printf("数组不空,共有%d个元素!\n", L.count); 134 } 135 if (IsFull(&L)) 136 printf("数组已满,共有%d个元素!\n", L.count); 137 else { 138 printf("数组未满,共有%d个元素!\n", L.count); 139 } 140 printf("字符g在数组的位置是:%d\n", Search(&L, 'g')); 141 system("pause"); 142 return 0; 143 }
运行结果: