首先需要定义一个存放数据的结构体(如果是C++的话可以使用类)
//定义数据结构体
struct MyArry
{
int* pBase; //存储数组第一个元素的地址
int nCnt; //当前有效元素的个数
int nLen; //数组能够存放元素最大的个数
};
接着实现一下数组的追加、插入、删除、排序、显示等方法
bool append_arry(MyArry * pArr, int nValue); //追加
bool insert_arry(MyArry * pArr, int nPos, int nValue); //插入
bool delete_arry(MyArry * pArr, int nPos, int *pValue); //删除数组内容
bool isEmpty(MyArry * pArr); //是否为空
bool isFull(MyArry * pArr); //是否满了
void sort_arry(MyArry* pArr);
void show_arry(MyArry * pArr);
void inversion_arry(MyArry * pArr); //反转数组元素
void init_arry(MyArry* pArr, int nLength);
在定义一个结构体变量的时候,需要对结构体的内容进行初始化,那么初始化的函数实现是这么来实现的
形参列表为指向数组地址的指针变量,一个初始化数组大小的长度
具体代码如下:
void init_arry(MyArry* pArr, int nLength)
{
pArr->pBase = (int*)malloc(sizeof(int) * nLength);
if (nullptr == pArr->pBase)
{
printf_s("%s \n", "内存分配失败");
exit(-1);
}
else
{
pArr->nCnt = 0;
pArr->nLen = nLength;
}
}
接下来实现一下追加的函数
bool append_arry(MyArry* pArr, int nValue)
{
if (isFull(pArr))
{
return false;
}
pArr->pBase[pArr->nCnt] = nValue;
++(pArr->nCnt);
return true;
}
那么较为复杂的为插入、删除元素,重点讲解一下
比如数组中已有5个元素
存储5个元素的数组假设在第三个位置插入一个元素,那么可以传入一个数组位置,假设定义为:
int nPos = 3;
在第三个数组位置插入元素那么插入的方法是这样的,需要把位置为3的内容移动到后面,在移动的时候需要从最后一个元素进行移动
大概是这样的:
插入元素移动示意图在插入的过程中,是有一些约束条件的,比如传入的nPos是不能小于1的,并且nPos不能大与当前有效元素个数+1
因为传入的nPos是从1开始的,而数组元素是从0开始的,当nPos大与当前有效元素的个数的时候,造成了跨越插入
因为数组是连续存储的,所以不支持这么插入
还有一个条件是当数组已经满的时候也是无法插入的
具体代码实现如下:
bool insert_arry(MyArry* pArr, int nPos, int nValue)
{
if (isFull(pArr))
{
return false;
}
if (nPos < 1 || nPos > pArr->nCnt + 1)
{
return false;
}
//插入数据
for (int i = pArr->nCnt - 1; i >= nPos - 1; --i)
{
pArr->pBase[i + 1] = pArr->pBase[i];
}
pArr->pBase[nPos - 1] = nValue;
++(pArr->nCnt);
return true;
}
删除某一个位置的元素应该怎么实现?
举个例子,假如这里还有一个元素为5个的数组
存储5个元素的数组假设需要删除第三个元素
删除第三个元素那么是不是只需要把后面的元素移动到删除的位置就可以了
示例图:
移动元素示意图
具体的代码实现如下:
bool delete_arry(MyArry* pArr, int nPos, int* pValue)
{
if (isEmpty(pArr))
{
return false;
}
if (nPos < 1 || nPos > pArr->nCnt)
{
return false;
}
*pValue = pArr->pBase[nPos - 1];
for (int i = nPos; i < pArr->nCnt; i++)
{
pArr->pBase[i - 1] = pArr->pBase[i];
}
--(pArr->nCnt);
return true;
}
其他函数实现:
//判断数组是不是为空
bool isEmpty(MyArry* pArr)
{
if (0 == pArr->nCnt)
{
return true;
}
return false;
}
//判断数组是不是满了
bool isFull(MyArry* pArr)
{
if (pArr->nCnt == pArr->nLen)
{
return true;
}
return false;
}
//使用冒泡排序
void sort_arry(MyArry* pArr)
{
int k = 0;
for (int i = 0; i < pArr->nCnt; i++)
{
for (int j = i + 1; j < pArr->nCnt; j++)
{
//升序
if (pArr->pBase[i] > pArr->pBase[j])
{
k = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = k;
}
}
}
}
void show_arry(MyArry* pArr)
{
if (isEmpty(pArr))
{
printf_s("%s \n", "数组为空");
}
else
{
for (int i = 0; i < pArr->nCnt; i++)
{
printf_s("%d \n", pArr->pBase[i]);
}
}
}
void inversion_arry(MyArry* pArr)
{
int i = 0;
int j = pArr->nCnt - 1;
int t = 0;
while (i < j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
++i;
--j;
}
}
int main()
{
MyArry arr;
init_arry(&arr, 6);
show_arry(&arr);
append_arry(&arr, 1);
append_arry(&arr, 2);
append_arry(&arr, 80);
append_arry(&arr, 4);
append_arry(&arr, 5);
//append_arry(&arr, 6);
insert_arry(&arr, 6, 99);
inversion_arry(&arr);
sort_arry(&arr);
/*int nDeleteValue = -1;
if (delete_arry(&arr, 6, &nDeleteValue))
{
printf_s("%s \n", "删除成功");
printf_s("删除的值是:%d \n", nDeleteValue);
}
else
{
printf_s("%s \n", "删除失败");
}*/
show_arry(&arr);
//printf_s("%d \n", arr.nCnt);
}
网友评论