复习顺序表
#pragma warning(disable : 4996)
void test()
{
int index;
array* arr1 = arr_init(); //初始化顺序表
while (1)
{
printf("1:创建数据 \n");
printf("2:插入数据 \n");
printf("3:删除数据 \n");
printf("4:清除数据 \n");
printf("5:退出程序 \n");
int cmd;
scanf("%d", &cmd);
switch (cmd)
{
case 1:
printf("请输入要创建数据的数量:\n");
scanf("%d", &index);
printf("输入%d个数据:", index);
for (int i = 0; i < index; i++)
{
int a;
scanf("%d", &a);
arr_push(arr1, a);
}
break;
case 2:
printf("请输入要插入数据的数量:\n");
scanf("%d", &index);
printf("输入%d个数据:", index);
for (int i = 0; i < index; i++)
{
int a;
scanf("%d", &a);
arr_push(arr1, a);
}
break;
case 3:
printf("请输入要删除的元素值:\n");
scanf("%d", &index);
while (arr_find(arr1, index) >= 0)
{
arr_remove(arr1, arr_find(arr1, index));
}
break;
case 4:
arr_clear(arr1);
printf("清楚数据成功\n");
break;
case 5:
arr_destroy(arr1);
exit(0);
break;
default:
printf("输入错误\n");
}
printf("当前的数据是:");
arr_out(arr1);
}
}
int main()
{
test();
return 0;
}
array.cpp:
#define MAX_SIZE 128
#define ERROR(log) printf("\n%s:%s %s %d\n", log, __FILE__, __FUNCTION__, __LINE__)
array* arr_init() {
array* temp = (array*)malloc(sizeof(array));
temp->data = (int*)calloc(MAX_SIZE, sizeof(Type));
if (temp == NULL)
{
ERROR("数组初始化失败");
return NULL;
}
temp->capacity = MAX_SIZE;
temp->length = 0;
return temp;
}
void arr_destroy(array* arr)
{
if (arr != NULL)
{
if (arr->data != NULL)
{
free(arr->data);
}
free(arr);
}
}
void arr_clear(array* arr) {
for (int i = 0; i < arr->length; i++)
{
arr->data[i] = 0;
}
arr->length = 0;
}
int arr_empty(array* arr)
{
if (arr == NULL || arr->length == 0)
{
return 1;
}
return 0;
}
Type arr_get(array* arr, int i)
{
if (arr_empty(arr)) return 0;
if (arr->length <= i || i < 0) return 0;
return arr->data[i];
}
void arr_push(array* arr, Type elem)
{
if (arr->length + 1 >= arr->capacity)
{
arr->data = (int *)realloc(arr->data, arr->capacity + MAX_SIZE);
}
if (arr->length < arr->capacity)
{
arr->data[arr->length++] = elem;
}
}
Type arr_pop(array* arr)
{
if (arr->length == 0)
{
ERROR("数组数据已空");
return 0;
}
Type elem = arr->data[--arr->length];
return elem;
}
void arr_insert(array* arr, int index, Type elem)
{
if (arr->length + 1 >= arr->capacity)
{
arr->data = (int*)realloc(arr->data, arr->capacity + MAX_SIZE);
}
int i = arr->length - 1;
for (i; i >= index; i--)
{
arr->data[i + 1] = arr->data[i];
}
arr->data[i+1] = elem;
arr->length++;
}
Type arr_remove(array* arr, int index) {
if (arr_empty(arr)) return 0;
Type elem = arr->data[index];
for (int i = index; i < arr->length; i++)
{
arr->data[i] = arr->data[i + 1];
}
arr->length--;
return elem;
}
void arr_out(array* arr)
{
for (int i = 0; i < arr->length; i++)
{
printf("%d ", arr->data[i]);
}
printf("\n");
}
int arr_find(array* arr, Type elem)
{
if (arr_empty(arr)) return -1;
for (int i = 0; i < arr->length; i++)
{
if (arr->data[i] == elem)
{
return i;
}
}
return -1;
}
array.h:
#pragma once
struct Array
{
int* data; //存储数组的指针
int length; //数组当前的长度
int capacity; //数组实际占用长度大小
};
typedef struct Array array; //让结构体类型不要再加struct
typedef int Type; //类型的定义 ,给int类型
//头文件只负责声明函数,不负责函数功能实现
#ifdef __cplusplus //如果你用了cpp文件实现,就会加上这段语句
extern "C" { //在c++编译环境里,按照c语言的方式编译,提高代码编译速度
#endif
//构造一个空的顺序线性表
array* arr_init();
//销毁顺序表
void arr_destroy(array* arr);
//重置为空表
void arr_clear(array* arr);
//判断是否为空表 //c语言在 c99 之前没有bool类型 在 c99 标准引入
int arr_empty(array* arr);
//返回第i个数据元素的值
Type arr_get(array* arr, int i);
//从尾部插入数据
void arr_push(array* arr, Type elem);
//从尾部删除数据
Type arr_pop(array* arr);
//在第i个位置之前插入新的数据元素
void arr_insert(array* arr, int index, Type elem);
//删除第i个数据元素, 并将删除的值返回
Type arr_remove(array* arr, int index);
//输出顺序表
void arr_out(array* arr);
//寻找元素的位置
int arr_find(array* arr, Type elem);
#ifdef __cplusplus
}
#endif