/*
* 动态数组
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Array
{
int *data;
int size;
int capacity;
} *Array; // struct Array* -> Array
// 初始化
Array initiation(int capacity)
{
Array arr = (Array) malloc(sizeof (struct Array));
arr->data = (int *) malloc(capacity * sizeof (int));
arr->size = 0;
arr->capacity = capacity;
if (arr == NULL || arr->data == NULL)
{
perror("Array initiation failed");
exit(-1);
}
return arr;
}
// 获取数组大小
int getSize(Array arr)
{
return arr->size;
}
// 获取数组容量
int getCapacity(Array arr)
{
return arr->capacity;
}
// 判断是否为空
int isEmpty(Array arr)
{
return arr->size == 0;
}
// 数组扩容/缩容
void resize(int newCapacity, Array arr)
{
arr->data = (int *) realloc(arr->data, newCapacity * sizeof (int));
arr->capacity = newCapacity;
}
// 在index位置插入元素e
void add(int index, int e, Array arr)
{
if (index < 0 || index > arr->size)
{
perror("Add failed, illegal index");
exit(-1);
}
if (arr->size == arr->capacity) // 数组满了的话就进行扩容
{
resize(2 * arr->capacity, arr);
}
for (int i = arr->size - 1; i >= index; i--)
{
arr->data[i + 1] = arr->data[i];
}
arr->data[index] = e;
arr->size++;
}
void addFirst(int e, Array arr)
{
add(0, e, arr);
}
void addLast(int e, Array arr)
{
add(arr->size, e, arr);
}
// 更改index位置元素
void set(int index, int e, Array arr)
{
if (index < 0 || index >= arr->size)
{
perror("Set failed, illegal index");
exit(-1);
}
arr->data[index] = e;
}
// 根据index查找元素
int get(int index, Array arr)
{
if (index < 0 || index >= arr->size)
{
perror("Get failed, illegal index");
return -1;
}
return arr->data[index];
}
int getLast(Array arr)
{
return get(arr->size - 1, arr);
}
int getFirst(Array arr)
{
return get(0, arr);
}
// 根据元素查找index
int find(int e, Array arr)
{
int i = 0;
for (i; i < arr->size; i++)
{
if (arr->data[i] == e)
{
return i;
}
}
return -1;
}
// 查看数组是否含有元素e
int contains(int e, Array arr)
{
for (int i = 0; i < arr->size; i++)
{
if (arr->data[i] == e)
{
return 1;
}
}
return 0;
}
// 删除index位置元素
int removeE(int index, Array arr)
{
if (index < 0 || index >= arr->size)
{
perror("Remove failed, illegal index");
return -1;
}
if (arr->size == arr->capacity / 4 && arr->capacity / 2 != 0)
{
resize(arr->capacity / 2, arr);
}
int ret = arr->data[index];
for (int i = index; i < arr->size; i++)
{
arr->data[i] = arr->data[i + 1];
}
arr->size--;
return ret;
}
int removeFirst(Array arr)
{
return removeE(0, arr);
}
int removeLast(Array arr)
{
return removeE(arr->size - 1, arr);
}
// 销毁数组
void destroy(Array arr)
{
free(arr->data);
arr->data = NULL;
if (arr->data == NULL)
{
free(arr);
arr = NULL;
if (arr == NULL)
{
printf("The array has successfully been destroyed.\n");
}
else
{
perror("Array destroy failed");
exit(-1);
}
}
else
{
perror("Array destroy failed");
exit(-1);
}
}
// 打印数组
void toString(Array arr)
{
printf("Array: size = %d, capacity = %d\n", arr->size, arr->capacity);
printf("[");
for (int i = 0; i < arr->size; i++)
{
printf("%d", arr->data[i]);
if (i != arr->size - 1)
{
printf(", ");
}
}
printf("]\n");
}
01-16
1492
02-02
4742