模拟动态数组及其一系列操作

线性表是一种数据结构。在逻辑上,具有除了第一个结点,其他结点有唯一前驱,除了最后一个结点,其他结点有唯一后驱的特点。顺序表和链式表是线性表的两种实现方式,它们只在存储方式上有区别,在逻辑上是一致的。

区别在于顺序表示使用连续的一段空间来存储,我们常用的数组就是线性表的一种顺序表示。

数组是静态分配内存的顺序表,静态分配内存导致数组的大小是固定的,一旦数据超过数组大小,将会导致数据的溢出。这是我们不想要的,因此还有动态分配内存的方式。动态分配内存可以防止数据溢出和空间的浪费。

此文在c++环境下编写,其实除了输入输出用到c++的函数,其他完全是c语言。

模拟了动态数组的初始化,插入,输出等操作,插入元素的平均时间复杂度o(n),删除元素的平均时间复杂度o(n),按值查找的平均时间复杂度o(n),按位查找的平均时间复杂度o(1)。

目录

初始化

判断数组是否为空 or 是否已满

尾部添加元素 

插入元素 

按位查找 

按值查找

删除元素

 求表长

打印数组


 


 

 

初始化

typedef int datatype;
struct Array{
    datatype *fData;//第一个元素的地址
    int max_size;//动态数组的最大长度
    int length;//动态数组的有效长度
};

void init(struct Array *arr,int maxsize){
    arr->fData = (datatype*)malloc(sizeof(datatype)*maxsize);//申请空间
    if(arr->fData==NULL){
        cout<<"空间分配失败"<<endl;
    }
    else {
        arr->max_size=maxsize;
        arr->length=0;
    }
}

判断数组是否为空 or 是否已满

bool isFull(struct Array *arr){
    if(arr->length>arr->max_size){
        return true;
    }
    else return false;
}

bool isEmpty(struct Array *arr){
    if(arr->length==0){
        return true;
    }
    else return false;
}

尾部添加元素 

/*
数组已满不能添加返回false,否则在尾部增加元素并返回true
*/
bool appendVal(datatype newone,struct Array *arr){
    if(isFull(arr)){
        return false;
    }
    else {
        *(arr->fData+arr->length)=newone;
        arr->length++;
        return true;
    }
}

插入元素 

函数的参数posi意味着新的元素添加到第posi个元素前。

/*
数组已满无法插入返回false
否则插入元素到第posi个前,并返回true
*/
bool insertVal(datatype newone,int posi,struct Array *arr){
    if(isFull((arr))){
        return false;
    }
    else {
        for(int i=arr->length-1;i>=posi-1;i--){
            *(arr->fData+i+1)=*(arr->fData+i);
        }
        *(arr->fData+posi-1)=newone;
        arr->length++;
        return true;
    }
}

按位查找 

返回第posi位的元素值

//按位查找
datatype searchOrder(int posi,struct Array arr){
    return *(arr.fData+posi-1);
}

按值查找

按值查找,返回出现该值的第一个位置,没有找到返回-1 

//按值查找
int searchVal(datatype value,struct Array arr){
    int i;
    for(i=0;i<arr.length;i++){
        if(*(arr.fData+i)==value){
            cout<<"7777"<<*(arr.fData)<<"&&&"<<endl;
            return i+1;
        }
    }
    if(i>=arr.length)return -1;
}

删除元素

//删除第posi位的元素
bool deleOrder(int posi,struct Array *arr){
    if(arr->length<posi){
        return false;
    }
    else {
        for(int i=posi;i<arr->length;i++){
            *(arr->fData+i-1)=*(arr->fData+i);
        }
        arr->length--;
        return true;
    }
}

 求表长

//求表长
int length(struct Array arr){
    return arr.length;
}

打印数组

void print(struct Array *arr){
    if(isEmpty(arr)){
        cout<<"数组为空!"<<endl;
    }
    else {
        for(int i=0;i<arr->length;i++){
            cout<<*(arr->fData+i)<<"  ";
        }
        cout<<endl;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值