数组的一大缺点就是长度定义后不能再改变,此程序实现了动态数组,类似于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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 07:20:01