数据结构(一)— 数组的操作
最近开始学习数据结构,觉得这门课蛮重要的,不论是刷题还是写安卓,数据结构还是要学好的,学习数据结构,我还是用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语言的相关知识,对指针复习和运用一下。