动态数组操作均封装成函数,涉及到的操作有:
- 动态数组初始化
- 打印
- 添加元素
- 删除元素
代码附上
// 动态数组
#include <stdio.h>
#include <stdlib.h>
#define InitialSize 10
#define EachIncreaseSize 10
#define BatchAddNumber 10
typedef struct DynamicArray
{
int *array;
int arrayLenth;
int initialSize;
} DynamicArray;
void Print();
// 初始化动态数组
void InitialList(DynamicArray *);
// 通过手动输入给数组批量、顺序添加元素
void AddElement(DynamicArray *);
// 打印数组
void PrintArray(DynamicArray);
// 自动给数组批量、顺序添加元素
// 自动添加多少请改变 宏定义BatchAddNumer 的值
void BatchAdd(DynamicArray *);
// 插入一个元素
void InsertElement(DynamicArray *);
// 删除一个元素
void DeletElement(DynamicArray *);
int main(void)
{
DynamicArray list;
InitialList(&list);
// AddElement(&list);
BatchAdd(&list);
PrintArray(list);
Print();
InsertElement(&list);
PrintArray(list);
DeletElement(&list);
PrintArray(list);
}
void Print()
{
printf("==========================\n");
}
void InitialList(DynamicArray *p)
{
// 在堆区申请100个int类型长度的内存
// 将这块内存的首地址存入结构体中的arry指针
p->array = (int *)malloc(InitialSize * sizeof(int));
// 数组长度为0
p->arrayLenth = 0;
// 数组初始化时,可存放的int数据长度为100
p->initialSize = InitialSize;
}
void AddElement(DynamicArray *p)
{
int i, j, n;
j = 0;
printf("请输入要添加元素的数量 \n");
scanf("%d", &n);
for (i = p->arrayLenth; i < p->arrayLenth + n; i++)
{
printf("请输入第%d个要添加的元素: ", ++j);
scanf("%d", (p->array) + i);
}
p->arrayLenth += n;
}
void PrintArray(DynamicArray list)
{
int i;
printf("当前数组信息:\n");
printf("当前数组长度为 %d \n", list.arrayLenth);
printf("当前数组容量为 %d \n", list.initialSize);
printf("打印数组\n");
for (i = 0; i < list.arrayLenth; i++)
printf("%d ", (list.array)[i]);
printf("\n");
}
void BatchAdd(DynamicArray *p)
{
int i, j;
for (i = 0, j = p->arrayLenth; i < BatchAddNumber; i++)
(p->array)[j++] = i + 1;
p->arrayLenth += BatchAddNumber;
}
void InsertElement(DynamicArray *p)
{
int i, n;
int *x = NULL;
int *y = NULL;
int *temp = NULL;
printf("请输入要插入到第几位\n");
scanf("%d", &i);
if(i < 1 || i > (p->arrayLenth + 1))
exit(EXIT_FAILURE);
if(p->arrayLenth >= p->initialSize)
temp = (int*)realloc(p->array, (InitialSize + EachIncreaseSize) * sizeof(int));
if(temp == NULL)
exit(EXIT_FAILURE);
// if temp != NULL && temp != p, 说明realloc函数没有在原来开辟的后面加空间
// 而是又开辟了一块大内存,因此原来开辟的内存应该被释放掉
p->initialSize += EachIncreaseSize;
if(temp != p->array)
free(p->array);
p->array = temp;
x = (p->array) + i - 1;
y = (p->array) + p->arrayLenth - 1;
printf("要插入元素的值是多少\n");
scanf("%d", &n);
while(y >= x)
{
*(y + 1) = *y;
y--;
}
*x = n;
p->arrayLenth++;
Print();
}
void DeletElement(DynamicArray * plist)
{
int i;
int &arryLenth = plist->arrayLenth;
int * arry = plist->array;
int *p = NULL, *q = NULL;
printf("请输入要删除第几个元素\n");
scanf("%d", &i);
if(i < 1 || i > arryLenth)
exit(EXIT_FAILURE);
p = arry + i - 1;
q = arry + arryLenth - 1;
while(p <= q)
{
*p = *(p + 1);
p++;
}
arryLenth--;
}