直接贴程序:
/*
2016年9月12日15:00:49
对动态数组的操作与算法
*/
#include<stdio.h>
#include<malloc.h> //malloc函数在此头文件
#include<stdlib.h> //使用exit函数需要此头文件
struct Array
{
int len; //数组的长度
int cnt; //数组有效数值的个数
int * pBase; //存储数组第一个元素的地址
};
//函数声明
void init_arr(struct Array * pArr, int length);
void show_arr(struct Array * pArr);
bool is_empty(struct Array * pArr);
bool is_full(struct Array * pArr);
bool append_arr(struct Array * pArr, int val);
bool insert_arr(struct Array * pArr, int pos, int val);
bool delete_arr(struct Array * pArr, int pos, int * val);
int get(struct Array * pArr, int pos);
void inversion_arr(struct Array * pArr);
void sort_arr(struct Array * pArr);
int main(void) //主函数用来测试各个函数的正确性
{
struct Array arr;
int val;
init_arr(&arr, 6); //初始化
show_arr(&arr); //输出数组的值
append_arr(&arr, 0);
append_arr(&arr, 8);
append_arr(&arr, 3);
append_arr(&arr, 6);
append_arr(&arr, -2);
show_arr(&arr);
sort_arr(&arr);
show_arr(&arr);
// printf("%d\n",get(3));
// insert_arr(&arr, 1, 99);
// show_arr(&arr);
// if(delete_arr(&arr, 3, &val))
// {
// printf("删除的值为:%d\n", val);
// }
// else
// {
// printf("删除失败!\n");
// }
// show_arr(&arr);
return 0;
}
void init_arr(struct Array * pArr, int length) //初试化,即创建一个数组
{
pArr->pBase = (int *)malloc( sizeof(int) * length); //动态数组
if( NULL == pArr->pBase)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
pArr->len = length;
pArr->cnt = 0;
return;
}
void show_arr(struct Array * pArr) //输出数组的值
{
int i;
if( 0 == pArr->cnt) //先判断数组是否为空
{
printf("该数组为空!\n");
}
else
{
for(i = 0; i < pArr->cnt; ++i)
{
printf(" %d \n", pArr->pBase[i]);
}
printf("\n");
}
}
bool is_empty(struct Array * pArr) //判断数组是否空
{
if( 0 == pArr->cnt )
return true;
else
return false;
}
bool is_full(struct Array * pArr) //判断数组是否满
{
if( pArr->len == pArr->cnt )
return true;
else
return false;
}
bool append_arr(struct Array * pArr, int val) //在数组末尾追加新元素val
{
if( is_full(pArr) ) //先判断数组是否满
{
return false;
}
else
{
pArr->pBase[pArr->cnt] = val;
++(pArr->cnt);
return true;
}
}
bool insert_arr(struct Array * pArr, int pos, int val) //在位置pos上插入一个新元素val,pos从1开始
{
int i;
if( is_full(pArr)) //先判断数组是否满
{
return false;
}
else if(pos<0 || pos>(pArr->cnt)+1) //判断插入的位置是否有效
{
return false;
}
else
{
for(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 Array * pArr, int pos, int * val) //将位置pos上的元素删除,并用val接收删除的值
{
int i;
if( is_empty(pArr)) //先判断数组是否空
{
return false;
}
else if(pos<0 || pos>pArr->cnt) //判断删除的数值是否有效范围
{
return false;
}
else
{
(*val) = pArr->pBase[pos-1];
for(i = pos; i<pArr->cnt; ++i) //将要删除的元素右边的数值整体向前移一个位置
{
pArr->pBase[i-1] = pArr->pBase[i];
}
--(pArr->cnt);
return true;
}
}
int get(struct Array * pArr, int pos) //获取数组pos位置上的数值,pos从1开始
{
return pArr->pBase[pos-1];
}
void inversion_arr(struct Array * pArr) //将数组的元素倒置
{
int i, j, t;
i = 0;
j = pArr->cnt-1;
while(i < j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
++i;
--j;
}
return;
}
void sort_arr(struct Array * pArr) //将数组的元素从小到大排序,使用的是冒泡排序
{
int i, j, t;
for(i = 0; i < pArr->cnt-1; ++i)
{
for(j = 0; j < pArr->cnt-1-i; ++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;
}
}
}
return;
}