动态数组

 前言:

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 }

运行结果:

转载于:https://www.cnblogs.com/joyeehe/p/7857991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值