欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组的增删改查

程序员文章站 2024-02-21 09:58:16
...
#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);
}