数据结构(一)---数组的操作
2017-09-17 18:20
197 查看
数据结构(一)— 数组的操作
最近开始学习数据结构,觉得这门课蛮重要的,不论是刷题还是写安卓,数据结构还是要学好的,学习数据结构,我还是用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语言的相关知识,对指针复习和运用一下。相关文章推荐
- 数据结构之数组创建及操作
- 数据结构之数组定义及基本操作
- 数据结构基础之数组实现线性表各种操作(二)
- 再回首,数据结构——字符串与数组的常见操作(顺序存储)
- 再回首,数据结构——字符串与数组的常见操作(链式存储,包含朴素匹配算法等)
- 数据结构基础之数组实现线性表各种操作
- 数据结构之数组(对数组的所有操作!)
- C语言------数据结构(栈操作,数组实现)
- 数据结构之链表与数组(二) -单向链表上的简单操作问题
- 数据结构:数组的操作(C语言描述)
- 数据结构线性数组的基本操作
- 数据结构之数组及其操作(C语言版)
- 【数据结构与算法】(一) c 语言实现数组的简单操作
- 数组引用做形参练习(数据结构test3)
- 数据结构之 栈stack 模板类(数组描述方法)
- 第三章数程序设计初步--控制结构综合项目4-2文件操作初体验练习3将数据写入文件
- oracle中关于表的所有操作(创建删除表,修改表结构,创建约束,操作表数据,增删改查等)
- 数据结构之栈的基本操作
- 【数据结构】顺序栈的基本操作
- 数据结构(四)---稀疏矩阵转三元组的相关操作