18 数组基本操作
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> //exit 函数需要 typedef struct arr { char* arr_name; int len; //当前数组长度 int maxlen; }*PARR,ARR; //PARR ==struct arr * , ARR==struct arr void init_arr(PARR array, int length); //初始化数组 void show_arr(PARR array); //显示数组 bool is_empty(PARR array); // 判断是否空 bool is_full(PARR array); // 判断是否满 int get_arr(PARR array, int num); //获得小标下标为num 的数组内容 bool append_arr(PARR array, int num); //数组尾部追加一个元素 bool insert_arr(PARR arr, int x, int num); //x 为插入的数,num为插入为值的下标 bool delete_arr_num(PARR array, int num); //根据下标删除一个元素 bool delete_arr_x(PARR array, int x); //根据值删除一个一个元素 void sort_arr(PARR array); //排序小到大 void inversion_arrr(PARR array); // 倒叙排列 main() { struct arr array; // 测试程序: init_arr(&array, 10); //append_arr(&array, 3); //append_arr(&array, 2); //append_arr(&array, 1); //insert_arr(&array, 0, 3); // 前面前面为数,后面为序号 //sort_arr(&array); //inversion_arrr(&array); //delete_arr_num(&array, 0); //delete_arr_x(&array, 3); //get_arr(&array, 0); //show_arr(&array); } //参数length 用户指定的数组长度 void init_arr(PARR ar, int length) { ar->arr_name = malloc(sizeof(int)); if (ar->arr_name == NULL) { printf(" malloc memory error!!"); exit(-1); } else { ar->maxlen = length; ar->len = 0; } } void show_arr(PARR ar) { int i; printf("array lenth is %d \n", ar->len); printf("array: "); if (is_empty(ar)) { printf(" array is empty!!"); } else for (i = 0; i < ar->len; i++) printf("%d ", ar->arr_name[i]); } bool is_empty(PARR ar) { if (ar->len == 0) return true; else return false; } bool is_full(PARR ar) { if (ar->len == ar->maxlen) return true; else return false; } //x 为增加的数组元素值 bool append_arr(PARR ar, int x) { bool app = false; if (is_full(ar)) { printf("array is full !"); } else { ar->arr_name[ar->len] = x; ar->len++; app = true; } return app; } int get_arr(PARR arr, int num) { if (num > arr->len) printf("the number is too big!"); else return arr->arr_name[num]; //printf("array[%d] = %d ", num, arr->arr_name[num]); } bool insert_arr(PARR arr, int x, int num) { bool ins = true; int i; if (num > arr->len) { ins = false; printf("number is too large !\n"); } else if (num == (arr->len)) { arr->arr_name[arr->len] = x; arr->len += 1; } else { for (i = (arr->len); i >= num; i--) arr->arr_name[i] = arr->arr_name[i - 1]; arr->len += 1; arr->arr_name[num] = x; } return ins; } bool delete_arr_num(PARR arr, int num) { int i; bool del = true; if (is_empty(arr)) { printf("array is empty!"); del = false; } else if (num > arr->len - 1) { printf("number is too large !\n"); del = false; } else if (num == arr->len - 1) arr->len -= 1; else for (i = num; i < arr->len - 1; i++) arr->arr_name[i] = arr->arr_name[i + 1]; arr->len -= 1; return del; } bool delete_arr_x(PARR arr, int x) { bool del = true; int i; //查找 循环查找x int j; //循环删除x for (i = 0; i < arr->len - 1; i++) { if (x == arr->arr_name[i]) { for (j = i; j < arr->len - 1; j++) arr->arr_name[j] = arr->arr_name[j + 1]; arr->len -= 1; } else if (x == arr->arr_name[arr->len - 1]) arr->len -= 1; else del = false; } return del; } void sort_arr(PARR arr) { int i, j = 0; int temp; for (i = 0; i < arr->len; i++) for (j = i + 1; j < arr->len; j++) if (arr->arr_name[i] > arr->arr_name[j]) { temp = arr->arr_name[i]; arr->arr_name[i] = arr->arr_name[j]; arr->arr_name[j] = temp; } } void inversion_arrr(PARR arr) { int i = 0, j = arr->len - 1; int temp; while (i < j) { temp = arr->arr_name[i]; arr->arr_name[i] = arr->arr_name[j]; arr->arr_name[j] = temp; i++; j--; } }