//要有可变数组 首先要数组可增长 然后要能获得某时的数组长度 最后要可以访问数组单元
#include <iostream>
#include <cstdlib>
//#include <cstring>
const int blockSize=20;
using namespace std;
typedef struct{
int *array;
int size;
}Array;
//下面函数中要传入的很多都是指针 但最好不要定义成指针类型
Array array_create(int init_size);
void array_free(Array *a);
//这里传入指针 因为结构体作函数参数时创建的是新的 如果传入结构体就没法起到free的作用了
int array_size(Array *a);
int* array_at(Array *a,int index);
//这个函数返回的是指针(可作为左值赋值)这一个函数相当于get和set两个函数的功能
//int array_get(const Array *a,int index);
//void array_set(Array *a,int index,int value);
void array_inflate(Array *a,int more_index);
int main()
{
Array a=array_create(100);
cout<<array_size(&a)<<endl;
*array_at(&a,0)=10;//由于是指针 就可以这样实现赋值
cout<<*array_at(&a,0)<<endl;
int number,cnt;
while(cin>>number&&number!=-1)
{
*array_at(&a,cnt++)=number;
//cin>>*array_at(&a,cnt++);
}
array_free(&a);
//在最后要记得free
}
Array array_create(int init_size)
{
Array a;
a.size=init_size;
a.array=(int *)malloc(sizeof(int)*a.size);
return a;
}
/*
也可以这样:
Array* array_create(Array* a,int init_size)
{
a->size=init_size;
a->array=(int*)malloc(sizeof(int)*a.size);
return a;
}
然而a可能指向过之前出现过的数组 就得先free*/
void array_free(Array* a)
{
free(a->array);
//为了保险起见还可以加入下两语句
a->array=NULL;
a->size=0;
}
//封装(起保护作用)可能随着算法的改变会需要改动
int array_size(Array *a)
{
return a->size;
}
int* array_at(Array *a,int index)
{
if(index >= a->size)
{
array_inflate(a,(index/blockSize+1)*blockSize - a->size);
//注意这边的第一个参数并不是*a,因为a本身表示一个指针,若为*a则说明该函数参数需要一个**类型
}
return &(a->array[index]);
}
int array_get(const Array *a,int index)
{
return a->array[index];
}
void array_set(Array *a,int index,int value)
{
a->array[index]=value;
}
void array_inflate(Array *a,int more_index)
{
int *p=(int*)malloc(sizeof(int)*(a->size+more_index));//注意这边加了a->size
//也就是 马上将由*p完全代替*a 要将原来的内容复制进入新的空间
int i;
for(i=0;i<(a->size);i++)
{
p[i]=a->array[i];
}
//这里的copy操作可以由cstring库里的memcpy函数来完成
//memcpy(p,a,a->size)
free(a->array);
a->array=p;
a->size+=more_index;
}
可变数组
最新推荐文章于 2022-06-12 16:08:21 发布