数组的一大缺点就是长度定义后不能再改变,此程序实现了动态数组,类似于Java中的ArrayList的结构,有增、删、排序、遍历、扩容追加等功能。
动态数组的实现:
/*
2013年2月16日19:18:35
此程序将数组中的元素进行追加、删除、排序、遍历输出等操作。
与java中的各方法相同,从而更加深入理解java中的方法。
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
struct Arr
{
int * pBase;
int len;
int cnt;
//int increment; //自动增长因子,便于快速增加数组长度,提高效率。
};
//函数声明
void init_arr(struct Arr *); //创造并初始化一个动态数组
bool is_empty(struct Arr *); //判断数组是否为空
bool is_full(struct Arr *); //判断数组是否为满
bool changelen_arr(struct Arr *); //改变数组长度
bool append_arr(struct Arr *); //追加数组元素
bool insert_arr(struct Arr *); //插入数组元素
bool delete_arr(struct Arr *); //删除数组元素
int get(struct Arr *); //获取数组元素
void sort_arr(struct Arr *); //排序
void show_arr(struct Arr *); //遍历输出
void inversion_arr(struct Arr *); //倒置
int find_val_arr(struct Arr *); //寻找含有此数值的元素
bool delete_all_arr(struct Arr *); //删除含有此数值的所有元素
int main(void)
{
struct Arr arr;
init_arr(&arr);
show_arr(&arr);
changelen_arr(&arr);
append_arr(&arr);
insert_arr(&arr);
delete_arr(&arr);
show_arr(&arr);
inversion_arr(&arr);
show_arr(&arr);
sort_arr(&arr);
printf("排序后的结果为:\n");
show_arr(&arr);
show_arr(&arr);
return 0;
}
void init_arr(struct Arr * pArr)
{
int i;
int length;
pArr->pBase = (int *)malloc(sizeof(int));
if (NULL == pArr->pBase)
{
printf("内存分配失败!\n");
exit(-1);
}
printf("请输入您需要的节点长度:");
scanf("%d", &length);
pArr->pBase = (int *)malloc(sizeof(int)*length);
pArr->len = length;
pArr->cnt = 0;
for (i=0; i<length; ++i)
{
printf("请输入第%d个数据:", i+1);
scanf("%d", &pArr->pBase[i]);
(pArr->cnt)++;
}
return;
}
bool is_empty(struct Arr * pArr)
{
if (pArr->cnt == 0)
{
printf("数组为空!\n");
return true;
}
else
return false;
}
bool is_full(struct Arr * pArr)
{
if (pArr->cnt == pArr->len)
{
return true;
}
else
return false;
}
void show_arr(struct Arr * pArr)
{
int i;
if( is_empty(pArr) )
{
printf("数组为空!\n");
return;
}
printf("\n数组中的数据为:\n");
for (i=0; i<pArr->cnt; ++i)
{
printf("%d ", pArr->pBase[i]);
}
printf("\n");
return;
}
bool changelen_arr(struct Arr * pArr)
{
int len;
printf("请输入修改后的长度:len = ");
scanf("%d", &len);
realloc(pArr->pBase, sizeof(int)*len);
pArr->len = len;
if (NULL == pArr->pBase)
{
printf("内存重新分配失败!\n");
return false;
}
else
return true;
}
bool append_arr(struct Arr * pArr)
{
int val;
if ( is_full(pArr) )
{
printf("数组已满!\n");
return false;
}
else
{
printf("请输入需要追加的数据:val = ");
scanf("%d", &val);
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;
return true;
}
}
bool insert_arr(struct Arr * pArr)
{
int i, t;
int pos, val;
if ( is_full(pArr) )
{
printf("数组已满,无法插入!\n");
return false;
}
input:
printf("请输入需要插入的位置:pos = ");
scanf("%d", &pos);
printf("请输入需要插入的数据:val = ");
scanf("%d", &val);
if (pos < 1 || pos > pArr->cnt+1)
{
printf("输入插入位置有误!\n");
goto input;
}
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 Arr * pArr)
{
int pos;
int i;
int val;
if ( is_empty(pArr) )
{
printf("数组为空,无法删除!");
return false;
}
printf("请输入您需要删除的元素位置:");
scanf("%d", &pos);
val = pArr->pBase[pos-1];
for (i=pos; i<pArr->cnt-1; ++i) //插入和删除元素都需要循环进行位移,效率很低。
{
pArr->pBase[i-1] = pArr->pBase[i];
}
printf("删除成功,您删除的元素是:%d", val);
return true;
}
int get(struct Arr * pArr)
{
int pos;
printf("请输入您需要获取的元素位置:");
scanf("%d", &pos);
printf("元素数据为:%d\n", pArr->pBase[pos-1]);
return pArr->pBase[pos-1];
}
//冒泡排序法
void sort_arr(struct Arr * pArr)
{
int i, j, t;
for (i=0; i<pArr->cnt; ++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;
}
void inversion_arr(struct Arr * pArr)
{
int i, j, t;
i = 0;
j = pArr->cnt;
while (i < j)
{
pArr->pBase[i] = pArr->pBase[j];
++i;
--j;
}
return;
}
int find_val_arr(struct Arr * pArr)
{
int i;
int val;
int count = 0;
printf("请输入需要查找的元素数值:val = ");
scanf("%d", &val);
for (i=0; i<pArr->cnt; ++i)
{
if (val == pArr->pBase[i])
{
printf("元素的下标为:%d", i);
count++;
}
}
printf("含有此元素数值的个数为:%d", count);
return count;
}
bool delete_all_arr(struct Arr * pArr)
{
int i, j;
int val;
int count = 0;
if ( is_empty(pArr) )
{
printf("数组为空,无法删除!");
return false;
}
printf("请输入需要删除的元素数值:val = ");
scanf("%d", &val);
for (i=0; i<pArr->cnt; ++i)
{
if (val = pArr->pBase[i])
{
for (j=i; j<pArr->cnt-1; ++j)
{
pArr->pBase[j-1] = pArr->pBase[j];
}
printf("删除成功!");
count++;
(pArr->cnt)--;
}
}
printf("删除元素的总个数为:%d", count);
return true;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lfhappypain/article/details/47293191