数组的增删改查

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

//定义一个Arr数组结构体,有三个成员变量
struct Arr{
    int * pBase;
    int len;
    int cnt;
};

//声明函数
void init_arr(struct Arr * pArr, int length);
bool append_arr(struct Arr * pArr,int val);
bool insert_arr(struct Arr * pArr,int pos, int val);
bool delete_arr(struct Arr * pArr,int pos, int* pVal);
bool get(struct Arr* pArr,int val);
bool is_empty(struct Arr * pArr);
bool is_full(struct Arr* pArr);
void sort_arr(struct Arr* pArr);
void show_arr(struct Arr * pArr);
void inversion_arr(struct Arr * pArr);
void quick_sort_arr(struct Arr* pArr,int left,int right);

int main(void){
    struct Arr arr;
    int val;
    
    init_arr(&arr, 6);
    //追加插入数据
    append_arr(&arr,1);
    append_arr(&arr,3);
    append_arr(&arr,5);
    append_arr(&arr,2);
    append_arr(&arr,4);
    printf("原数组:");
    show_arr(&arr);
    printf("排序后:");
    sort_arr(&arr);
    // quick_sort_arr(&arr,0,4);
    show_arr(&arr);
    printf("倒置后数组:");
    inversion_arr(&arr);
    show_arr(&arr);
    if(delete_arr(&arr,1,&val)){
        printf("删除 %d 成功\n", val);
    }else{
        printf("删除失败! \n");
    }
    show_arr(&arr); 

    return 0;
}

//初始化数组
void init_arr(struct Arr * pArr, int length){
    pArr->pBase = (int *)malloc(sizeof(int)*length);
    if(NULL == pArr->pBase){
        printf("动态内存分配失败!\n");
        exit(-1);
    }else{
        pArr->len = length;
        pArr->cnt = 0;
    }
}

//判断是否为NULL
bool is_empty(struct Arr * pArr){
    if(0 == pArr->cnt){
        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){
    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 val){
    if(is_full(pArr)){
        return false;
    }else{
      pArr->pBase[pArr->cnt]  = val ;
      (pArr->cnt)++;
      return true;
    }

}

//插入数据
bool insert_arr(struct Arr * pArr,int pos, int val){
    int i;
    if(is_full(pArr))
        return false;
    if(pos<1 || pos>pArr->cnt+1)
        return false;

    for(i = pArr->cnt-1; i >=pos-1; i--){
        pArr->pBase[i+1] = pArr->pBase[i];
    }
    pArr->pBase[pos-1] = val;
    return true ;
}

//删除数据
bool delete_arr(struct Arr * pArr,int pos, int* pVal){
    int i;
    if(is_empty(pArr))
        return false;
    if(pos<1 || pos>pArr->cnt)
        return false;

    *pVal = pArr->pBase[pos-1];
    for(i = pos; i <= pArr->cnt; ++i){
        pArr->pBase[i-1] = pArr->pBase[i];
    }
    pArr->cnt--;
    return true ;
}

//转置数组
void inversion_arr(struct Arr * pArr){
    int i;
    int j = pArr->cnt-1;
    while(i < j){
        int k = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = k;
        ++i;
        --j;
    }
}

//排序
void sort_arr(struct Arr * pArr){
    int i,j;
    for(i=0;i<pArr->cnt;i++){
        for(j=0;j<pArr->cnt-i-1;j++){
            if(pArr->pBase[j+1] < pArr->pBase[j]){
                int k = pArr->pBase[j+1];
                pArr->pBase[j+1] = pArr->pBase[j];
                pArr->pBase[j] = k;
            }
        }
    }
}

//快速排序
void quick_sort_arr(struct Arr* pArr,int left,int right){

    int i = left;
    int j = right;
    int key = pArr->pBase[i];
    if( i > j){
        return;
    }
    while(i<j){
        while( i < j && pArr->pBase[j] > key ){
            j--;
        }
        if( i < j){
            pArr->pBase[i++] = pArr->pBase[j];
        }
        while( i < j && pArr->pBase[i] < key ){
            i++;
        }
        if( i < j){
            pArr->pBase[j--] = pArr->pBase[i];
        }
    }
    pArr->pBase[i] = key;
    quick_sort_arr(pArr,left,i-1);
    quick_sort_arr(pArr,i+1,right);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梧杵

还是学生,生活太难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值