使用动态内存分配,实现数组的增删改查等一些基本功能
/*
*@Author Mr Zhao
*@Date: 2021-1
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
//定义了一个名字为struct Arr的数据类型,有三个成员
struct Arr {
int * pBase; //存储的是数组第一个元素的地址
int len; //数组所能容纳的元素个数
int cnt; //当前数组有效元素的个数
};
void init_arr(struct Arr * pArr, int length); //初始化
bool append_arr(struct Arr * pArr, int val); //末尾追加
bool insert_arr(struct Arr * pArr, int pos, int val); //插入元素
bool delete_arr(struct Arr * pArr, int pos, int * pVal); //删除元素
bool search1_arr(struct Arr * pArr, int val); //按数查找
bool search2_arr(struct Arr * pArr, int pos); //按位查找
bool is_empty(struct Arr * pArr); //是否为空
bool is_full(struct Arr * pArr); //是否已满
void sort_arr(struct Arr * pArr); //冒泡排序
void inversion_arr(struct Arr * pArr); //倒置
void clear_arr(struct Arr * pArr); //清空
void show_arr(struct Arr * pArr); //遍历输出
int main(void) {
struct Arr arr;
//传入地址效率更高,四个字节()
int val;
init_arr(&arr, 6);
append_arr(&arr, 4);
append_arr(&arr, 5);
append_arr(&arr, 10);
inversion_arr(&arr);
sort_arr(&arr);
search1_arr(&arr, 10);
show_arr(&arr);
search2_arr(&arr, 2);
clear_arr(&arr);
show_arr(&arr);
return 0;
}
/*
*初始化数组数据
*使用动态内存分配方法
*/
void init_arr(struct Arr * pArr, int length) {
pArr->pBase = (int *)malloc(sizeof(int) * length);
if(NULL == pArr->pBase) {
printf("动态内存分配失败!\n");
exit(-1); //终止整个程序
} else {
pArr->len = length; //初始化
pArr->cnt = 0; //初始化
// printf("内存分配成功!\n");
}
return;
}
/*检验数组是否为空*/
bool is_empty(struct Arr * pArr) {
if(0 == pArr->cnt) {
return true;
} else {
return false;
}
}
/*打印数组*/
void show_arr(struct Arr * pArr) {
if(is_empty(pArr)) {
printf("数组为空!\n");
} else {
for(int i = 0; i < pArr->cnt; i++) {
printf("%d\t", pArr->pBase[i]);
printf("\n");
}
}
}
/*检验数组空间是否满了*/
bool is_full(struct Arr * pArr) {
if(pArr->cnt == pArr->len) {
return true;
} else {
return false;
}
}
/*实现追加功能*/
bool append_arr(struct Arr * pArr, int val) {
//满时返回false
if(is_full(pArr)) {
return false;
}
// 不满时追加
pArr->pBase[pArr->cnt] = val; //cnt就是新放入元素的下标,每放一个元素cnt++,
(pArr->cnt)++; // cnt表当前有效元素个数
return true;
}
/*实现插入功能*/
bool insert_arr(struct Arr * pArr, int pos, int val) {
if(is_full(pArr)) {
return false;
}
if(pos < 1 || pos > pArr->cnt + 1) {
return false;
}
//插入数后面所有数后移一位
for(int i = pArr->cnt - 1;i >= pos - 1; i--) {
pArr->pBase[i + 1] = pArr->pBase[i];
}
//插入数据
pArr->pBase[pos - 1] = val;
pArr->cnt++;
return true;
}
/*实现删除数组元素功能*/
bool delete_arr(struct Arr * pArr, int pos, int * pVal) {
if(is_empty(pArr)) {
return false;
}
if(pos < 1 || pos > pArr->cnt) {
return false;
}
*pVal = pArr->pBase[pos - 1];
for(int i = pos; i < pArr->cnt; i++) {
pArr->pBase[i - 1] = pArr->pBase[i];
}
pArr->cnt--;
return true;
}
/*实现数组按数查找功能,此处运用顺序查找法*/
bool search1_arr(struct Arr * pArr, int val) {
bool isFlag = true;
for(int i = 0; i < pArr->cnt; i++) {
if(val == pArr->pBase[i]) {
isFlag = false;
printf("找到了!%d位于数组第%d位!\n", val, i + 1);
break;
}
}
if(isFlag) {
printf("您要查找的数据不存在!\n");
}
}
/*实现数组按位查找*/
bool search2_arr(struct Arr * pArr, int pos) {
int val;
if(pos < 1 || pos > pArr->cnt - 1) {
printf("输入位置错误,程序退出!\n");
exit(-1);
}
val = pArr->pBase[pos - 1];
printf("查找成功,第%d位的数据是%d。", pos, val);
return true;
}
/*实现数组倒置*/
void inversion_arr(struct Arr * pArr) {
int i = 0;
int j = pArr->cnt - 1;
int t;
while(i < j) {
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
i++;
j--;
}
}
/*实现数组排序,此处使用冒泡排序法*/
void sort_arr(struct Arr * pArr) {
int t;
for(int i = 0; i < pArr->cnt - 1;i++) {
for(int j = 0; j < pArr->cnt - i - 1; j++) {
if(pArr->pBase[j] > pArr->pBase[j + 1]) {
t = pArr->pBase[j];
pArr->pBase[j] = pArr->pBase[j + 1];
pArr->pBase[j + 1] = t;
}
}
}
}
//调用menset函数清空结构体
void clear_arr(struct Arr * pArr) {
memset(pArr, 0, sizeof pArr); //调用menset函数清空结构体
printf("清空成功!\n");
}