c语言可变数组的实现

/*可变数组*/
/**创建返回指针类型**/
#include<stdio.h>
#include<stdlib.h>
typedef int Ele;
const Ele ERROR=0;
typedef struct Array{
Ele *data;
int size;
}*Arr;
Arr createarr(int size){
Arr arr=(Arr)malloc(sizeof(struct Array));
arr->data=(Ele*)malloc(sizeof(Ele)*size);
arr->size=size;
return arr;
}
void More(Arr arr,int more){
    if(arr==NULL)
        return;
Ele *p=(Ele*)malloc(sizeof(Ele)*(arr->size+more));
for(int i=0;i<arr->size;i++){
p[i]=arr->data[i];
}
free(arr->data);
arr->data=p;
arr->size=arr->size+more;

}
void print(Arr arr){
    if(arr==NULL)
        return;
for(int i=0;i<arr->size;i++){
printf("%d ",arr->data[i]);
}

}


void freearr(Arr *parr){
    if(parr==NULL)
     return;
    if(*parr==NULL)
        return;
free((*parr)->data);
free(*parr);
*parr=NULL;
}
Ele getarr(Arr arr ,int x){
if(arr==NULL)
    return ERROR;

return arr->data[x];
}
void setarr(Arr arr,int x,Ele e){
if(arr==NULL)
    return;
arr->data[x]=e;
}

int main(){
Arr arr=createarr(10);
print(arr);
printf("\n");
More(arr,20);
print(arr);
printf("\n");
setarr(arr,5,888); 
print(arr);
}

/*可变数组*/
/*返回不返回指针类型**/
#include<stdio.h>
#include<stdlib.h>
typedef int Ele;
const Ele ERROR=0;
typedef struct Array{
Ele *data;
int size;
}Arr;
Arr createarr(int size){
Arr arr;
arr.data=(Ele*)malloc(sizeof(Ele)*size);
arr.size=size;
return arr;
}
void More(Arr *arr,int more){
    if(arr==NULL)
        return;
Ele *p=(Ele*)malloc(sizeof(Ele)*(arr->size+more));
for(int i=0;i<arr->size;i++){
p[i]=arr->data[i];
}
free(arr->data);
arr->data=p;
arr->size=arr->size+more;

}
void print(const Arr *arr){//传指针好,只会申请一个指针类型的临时!如果传结构体本身,则申请一个结构体类型的临时变量----(传值传递形参是实参的备份)
//引申:C++中引用传递形参变量和实参变量对应内存中同一块空间
    if(arr==NULL)
        return;
for(int i=0;i<arr->size;i++){
printf("%d ",arr->data[i]);
}

}


void freearr(Arr *arr){
 free(arr->data);//释放指针指向的堆空间
arr->data=NULL;
arr->size=0;
}
Ele getarr(const Arr *arr ,int x){
if(arr==NULL)
    return ERROR;
return arr->data[x];
}
void setarr(Arr *arr,int x,Ele e){
if(arr==NULL)
    return;
arr->data[x]=e;
}

int main(){
Arr arr=createarr(10);
print(&arr);
printf("\n");
More(&arr,20);
print(&arr);
printf("\n");
setarr(&arr,5,888); 
print(&arr);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值