C语言之数组的实现

2017-08-27  本文已影响23人  冰三尺

#include <stdio.h>
#include <stdlib.h> //包含了malloc
#include <stdlib.h> //包含了exit

#define bool int

struct Arr {
    int *pBase; //数组第一个元素的地址
    int len; //元素个数
    int cnt; //当前数组有效元素的个数
//    int increment; //自动增长因子
};

void init_arr(struct Arr *array, int len);
bool append_arr(struct Arr *array, int value);
bool insert_arr(struct Arr *array, int pos, int value);
bool delete_arr(struct Arr *array, int pos, int *pValue);
//bool get();
bool is_empty(struct Arr *array);
bool is_full(struct Arr *array);
//void sort_arr();
void show_arr(struct Arr * pArr);
void inversion_arr(struct Arr *array);



int main(int argc, const char * argv[]) {
    
    //定义一个结构体变量
    struct Arr arr;
    //把结构体变量的地址赋值
    init_arr(&arr, 6);
    printf("%d\n", arr.len);
    printf("%p\n", arr.pBase);
    printf("%d\n", arr.cnt);
    show_arr(&arr);
    append_arr(&arr, 1);
    append_arr(&arr, 2);
    append_arr(&arr, 3);
    append_arr(&arr, 4);
    append_arr(&arr, 5);
//    insert_arr(&arr, 3, 99);
    show_arr(&arr);
    inversion_arr(&arr);
    show_arr(&arr);
    int value;
    if (delete_arr(&arr, 1, &value)) {
        printf("删除成功!");
        printf("删除的元素是%d\n", value);
        show_arr(&arr);
    }else {
        printf("删除失败");
    }
    
    return 0;
}

void init_arr(struct Arr * parray, int length) {
//    (*parray).len = 99;
    //动态分配内存, 如果失败则返回NULL, malloc函数返回的是一个泛型, 就是不知道要返回什么类型,泛型可以代表任何类型
    parray->pBase = (int *)malloc(sizeof(int) * length);
    if (NULL == parray->pBase) {
        printf("动态内存分配失败");
        exit(-1);
    }else {
        parray->len = length;
        parray->cnt = 0;
    }
    return;
}

bool is_empty(struct Arr *pArr) {
    if (pArr->cnt == 0) {
        return 1;
    }else {
        return 0;
    }
}

bool is_full(struct Arr *pArr) {
    if (pArr->len == pArr->cnt) {
        return 1;
    }
    return 0;
}
void show_arr(struct Arr *pArr) {
    if (is_empty(pArr)) {
        printf("空数组\n");
    }else {
        for (int i = 0; i < pArr->cnt; ++i) {
            printf("%d ", pArr->pBase[i]);
        }
        printf("\n");
    }
}

bool append_arr(struct Arr *pArr, int value) {
    if (is_full(pArr)) {
        return 0;
    }else {
        pArr->pBase[pArr->cnt] = value;
        (pArr->cnt)++;
        return 1;
    }
}

bool insert_arr(struct Arr *pArr, int pos, int value) {
    int i;
    if (is_full(pArr)) {
        return 0;
    }
    if (pos < 1 || pos > pArr->cnt+1) {
        return 0;
    }
    //[1, 2]
    for (i = pArr->cnt - 1; i > pos - 2; i--) {
        printf("%d, index = %d\n", pArr->pBase[i], i);
        pArr->pBase[i + 1] = pArr->pBase[i];
        printf(" %d\n", pArr->pBase[i + 1]);
    }
    
    pArr->pBase[pos - 1] = value;
    (pArr->cnt)++;
    return 0;
}


bool delete_arr(struct Arr *array, int pos, int *pValue) {
    int i;
    if (is_full(array)) {
        return 0;
    }
    if (pos<1 || pos>array->cnt) {
        return 0;
    }
    
    *pValue = array->pBase[pos - 1];
    for (i = pos; i < array->cnt; i++) {
        array->pBase[i - 1] = array->pBase[i];
    }
    array->cnt--;
    
    return 1;
}


void inversion_arr(struct Arr *array) {
    int i = 0;
    int j = array->cnt - 1;
    int t;
    
    while (i < j) {
        t = array->pBase[i];
        array->pBase[i] = array->pBase[j];
        array->pBase[j] = t;
        i++;
        j--;
    }
}





上一篇下一篇

猜你喜欢

热点阅读