用c语言 简单实现JAVA里面的ArryList 功能,实现内存自动扩展

#include<stdio.h>
#include<stdlib.h>
struct Arr{
    int * pbase;//数组首地址
    int len;//数组所能容纳的总长度
    int cnt;//数组有效个数;
    int increment;//内存增长因子

};

void init(struct Arr *parr,int len);
bool append(struct Arr *parr,int content);
bool append_auto(struct Arr *parr,int content);
bool insert(struct Arr *parr,int pos,int content);
bool delet(struct Arr *parr,int pos,int * deledata);
//int  get();
bool sortAsc_arr(struct Arr *parr);
void show_arr(struct Arr *arr);
bool isEmpty(struct Arr *arr);
bool  isFull(struct Arr *arr);
bool  converse(struct Arr *parr);
void  newrealloc(struct Arr *parr);


int  main(){
    struct Arr arr;
    int deledata;
    init(&arr,3);
    append_auto(&arr,4);
    append_auto(&arr,5);
    append_auto(&arr,6);
    append_auto(&arr,7);
//    append(&arr,8);
//    append(&arr,9);
    
    insert(&arr,2, 30);//在pos位置插入数据,pos从1开始
    
    printf("所有数据:");
    show_arr(&arr);
    if(delet(&arr,3,&deledata)){
        printf("删除元素为:%d\n",deledata);
    }
    printf("删除后剩余数据:");
    show_arr(&arr);
    converse(&arr);
    printf("倒置后的数据:");
    show_arr(&arr);
    printf("升序排序后的数据:");
    sortAsc_arr(&arr);
    show_arr(&arr);

    return 0;
}

void init(struct Arr *parr,int len){
     parr->pbase=(int *)malloc(sizeof(int)*len);
     if((*parr).pbase==NULL){
         printf("内存分配失败!");
         exit(-1);
     }else{
    
     parr->cnt=0;
     parr->len=len;
 }

      return;
    
}

bool  isFull(struct Arr *parr){
    if(parr->cnt==(*parr).len)
        return true;
      else

         return  false;
}

bool isEmpty(struct Arr *parr){
    if(parr->cnt==0)
        return true;
       else
           return false;
}

void show_arr(struct Arr * parr){
       
    if(isEmpty(parr)){
       printf("数组数据为空!\n");
        
    }else
    
    for(int j=0;j<parr->cnt;j++){
            printf("%3d",(parr->pbase)[j]);
        }
            printf("\n");
        

}

//添加数据
bool append(struct Arr * parr,int content){
        if(isFull(parr))
        return false;
    
        else{
     int cnt=parr->cnt;
     parr->pbase[cnt]=content;
     parr->cnt=cnt+1;

        }

            return true;


          
        
}  

bool  append_auto(struct Arr *parr,int content){
        if(isFull(parr)){
        parr->increment=2;
    
        newrealloc(parr);
    
        }
        
        int cnt=parr->cnt;
        parr->pbase[cnt]=content;
        parr->cnt=cnt+1;

        return true;
}
 
bool insert(struct Arr * parr,int pos,int content){
/*       if(isFull(aprr))    
       {
          printf("数组已满");
          return false;
       }else {
           for(int i=(parr->cnt)-1;i>=pos-1;i--){
               (parr->pbase)[i+1]=parr->pbase[i]
           }

       }

*/     
    if(isFull(parr))
        return false;
    if(pos<1||pos>parr->cnt+1){
        printf("不符合插入要求");
        return false;

    } else{

        for(int i=parr->cnt-1;i>=pos-1;i--){
            parr->pbase[i+1]=parr->pbase[i];
        }
            parr->pbase[pos-1]=content;

            parr->cnt=parr->cnt+1;

   
    }
             
           return true;
}

bool delet(struct Arr * parr,int pos,int * deledata){
     if(isEmpty(parr))
         return false;
    if(pos<1||pos>parr->len){
        printf("删除的位置不正确");
        return false;
    }else{
        *deledata=parr->pbase[pos-1];
        for(int i=pos;i<parr->cnt;i++)

        parr->pbase[i-1]=parr->pbase[i];
    }
            parr->cnt=parr->cnt-1;
            return true;
}

bool converse(struct Arr *parr ){
    if(isEmpty(parr)){
          printf("没有数据不能倒置");
          return false;
    }
           
       int i=0;
       int j=parr->cnt-1;
       while(i<j){
           int mid=parr->pbase[i];
           parr->pbase[i]=parr->pbase[j];
           parr->pbase[j]=mid;
           i++;
           j--;
       }
           
            return true;
}

bool sortAsc_arr(struct Arr *parr){
    if(isEmpty(parr))
        return false;
    int middata,i,j;
    for( i=0;i<parr->cnt-1;i++){

        for( j=i+1;j<parr->cnt;j++){
            if(parr->pbase[i]>=parr->pbase[j]){
                middata=parr->pbase[i];
                  parr->pbase[i]=parr->pbase[j];
                  parr->pbase[j]=middata;
            }
        }
    }

              return true;
}
        

void newrealloc(struct Arr *parr){
    if(parr->cnt==parr->len){
        parr->pbase=(int *)realloc(parr->pbase,sizeof(int)*(parr->len)*(parr->increment));
        parr->len=(parr->increment)*(parr->len);
    }
        if(parr->pbase==NULL)
        {
           printf("内存分配失败");
           exit(1);
        
        }

        return;
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值