C语言风格动态数组实现,但是C++
#include<iostream>
#include<stdexcept>
using namespace std;
struct List{
int *data; //指向堆内存的指针,存储实际元素
int size; //当前元素个数
int cap; //当前已分配的内存容量(可容纳的元素个数)
};//创建数组
List *make(int cap=1){
List*p=new List; // 分配 List 结构体内存
p->data=new int[cap]; // 分配元素存储空间
p->size=0;
p->cap=cap; // 记录容量
return p;
}
//内存释放
void del(List* p){
delete[]p-> data;
delete p;
}
//扩容/缩容
void resize(List* p,int cap){
if (cap<1) cap=1; //防止容量变为 0 避免后续 new int[0] 引发问题
int *tmp=new int[cap]; //申请新数组
int copySize=(p->size<cap)?p->size:cap; // 拷贝时取最小值,防止越界
for(int i=0;i<copySize;i++){ //拷贝
tmp[i]=p->data[i];
}
delete[]p->data; //释放旧数组内存
p->data=tmp;
p->cap=cap;
if(p->size>cap)p->size=cap;
}
//push
void Mypush(List* p,int x){
if(p->size==p->cap)resize(p,p->cap*2);
p->data[p->size++]=x;
// 等价于:
// p->data[p->size] = x;
// p->size++;
}
//指定位置插入
void Myinsert(List* p,int idx,int x){
if(idx<0||idx>p->size){
cerr<<"err;idx="<<idx<<" size="<<p->size<<endl;
exit(1);
}
if(p->size==p->cap)resize(p,p->cap*2);
for(int i=p->size;i>idx;i--){ // 从后往前移动元素,腾出插入位置
p->data[i]=p->data[i-1];
}
p->data[idx]=x;
p->size++;
}
// 头部插入
void Myunshift(List* p,int x){
Myinsert(p,0,x);
}
//尾部删除
int pop(List *p){
if(p->size==0){
cerr<<"err:empty"<<endl;
exit(1);
}
if(p->size==p->cap/4&&p->cap>1) resize(p,p->cap/2);
return p->data[--p->size];
}
int cut(List* p,int idx){
if(idx<0||idx>=p->size){
cerr<<"err:idx="<<idx<<" size="<<p->size<<endl;
exit(1);
}
if(p->size==p->cap/4&&p->cap>1)resize(p,p->cap/2);
int val=p->data[idx]; // ③ 保存要删除的值
for(int i=idx;i<p->size-1;i++){//元素前移,覆盖被删位置
p->data[i]=p->data[i+1];
}
p->size--;
return val;
}
int shift(List* p){
return cut(p,0);
}
int get(List*p,int idx){
if(idx<0||idx>=p->size){
cerr<<"err:idx="<<idx<<" size="<<p->size<<endl;
exit(1);
}
return p->data[idx];
}
//修改
int put(List*p,int idx,int x){
int old=get(p,idx);
p->data[idx]=x;
return old;
}
int len(List* p){
return p->size;
}
bool empty(List *p){
return p->size==0;
}
void show(List* p){
cout<<"size="<<p->size<<" cap="<<p->cap<<endl;
cout<<"[";
for(int i=0;i<p->size;i++){
if(i)cout<<" ,";
cout<<p->data[i];
}
cout<<"]"<<endl;
}
int main(){
List* list = make(2);
Mypush(list, 10);
Mypush(list, 20);
Mypush(list, 30);
show(list);
Myinsert(list, 1, 99);
show(list);
pop(list);
show(list);
cut(list, 1);
show(list);
shift(list);
show(list);
del(list);
return 0;
}
更多推荐
所有评论(0)