数据结构(一)---数组的操作

数据结构(一)— 数组的操作

最近开始学习数据结构,觉得这门课蛮重要的,不论是刷题还是写安卓,数据结构还是要学好的,学习数据结构,我还是用c语言来实现,好理解一点。

数据结构之数组定义

数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。
  数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题。首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中。当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据.
  了解了以上知识后,第一个问题就来了,如何才能找到数据在内存中的地址?这个问题其实很简单,因为数组在内存中是一组连续的数据集合,所以我们只要知道数组首地址,然后通过对应字节长度的加减就可以找到对应字节数的数据,有了这些就可以定义出我们的数组,但是,作为一个合理的数组,还应该有数组长度的标志len和数组有效元素的标志cnt。由此给出对数组的定义(本例中采用结构体,对结构体不了解的朋友可以)

struct Arr{
    int *pBase;//存储数组第一个元素的地址的 
    int len;  //数组的最大容量 
    int cnt;  //当前数组的有效元素的个数 
}; 

数组的操作

对一种存储方式,对其的操作一般就是,初始化,增加,删除,排序,插入这些,把这些基本的操作完成,就差不多了

void init_arr(struct Arr*pArr,int length); //初始化 
bool append_arr(struct Arr*pArr,int val);//追加 
bool insert_arr(struct Arr*pArr,int pos,int val);//插入 位置pos从1开始,值 
bool delete_arr(struct Arr*pArr,int pos,int *pval);//删除 
bool is_full(struct Arr*pArr);//判断是否是满的 
bool is_empty(struct Arr*pArr);//判断是否为空 
void show_arr(struct Arr*pArr);//输出 
void inversion_arr(struct Arr*pArr);//倒置
void sort_arr(struct Arr*pArr);//排序
void init_arr(struct Arr*pArr,int length){
    pArr->pBase = (int*)malloc(sizeof(int)*length);//动态申请空间
    if(pArr->pBase==NULL){
        printf("动态内存分配失败\n");
        exit(-1);
    } 
    else{
        pArr->len = length;
        pArr->cnt = 0;
    }
} 
bool is_empty(struct Arr*pArr){
    if(pArr->cnt==0)
        return true;
    else
        return false;

} 

bool is_full(struct Arr*pArr){
    if(pArr->cnt == pArr->len)
        return true;
    else
        return false;

} 
bool append_arr(struct Arr*pArr,int val){
    if(is_full(pArr))
        return false;
    else{
    pArr->pBase[pArr->cnt] = val;
    (pArr->cnt)++;
        return true;
   }
}
bool insert_arr(struct Arr*pArr,int pos,int val){
    int i;
    if(is_full(pArr))
        return false;
    if(pos <1||pos>pArr->len)
        return false;
    for(i = pArr->cnt-1; i >= pos-1;--i)
    {
        pArr->pBase[i+1] = pArr->pBase[i]; 

    }
    pArr->pBase[pos-1] = val;
    (pArr->cnt)++
    return true;
}
bool delete_arr(struct Arr*pArr,int pos,int *pval){
    int i;
    if(is_empty(pArr))
        return false;
    if(pos < 1||pos>pArr->cnt)
        return false;
    *pval = pArr->pBase[pos-1]; 
    for(i=pos;i<pArr->cnt;++i){
        pArr->pBase[i-1] = pArr->pBase[i];

    }
    pArr->cnt--;
    return true;
}
void inversion_arr(struct Arr*pArr){
    int i=0;
    int j = pArr->cnt-1;
    int t;

    while(i < j){
        t = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = t;
        ++i;
        --j;
    }
} 
void show_arr(struct Arr*pArr){
    if(is_empty(pArr))
        printf("数组是空的\n");
    else{
        for(int i = 0; i < pArr->cnt;++i)
        {
            printf("%d ",pArr->pBase[i]);
        }
        printf("\n"); 
    } 
}
void sort_arr(struct Arr*pArr){
    int i,j,t;
    for(i = 0; i < pArr->cnt;++i){
        for(j=j+1;j < pArr->cnt;++j){
            if(pArr->pBase[i] > pArr->pBase[j]){
                t = pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = t;
                ++i;
                --j;
            }
        }
    }
} 

总结

这个是自己写的数组,写了一些基本的操作,也就是简单复习一下C语言的相关知识,对指针复习和运用一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值