数据结构之数组定义及基本操作

数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。
数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题。首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中。当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据。了解了以上知识后,我们就可以进行数组的设计了(我们就可以设计自己的数组供别人去使用了,哈哈)。
了解了以上知识后,第一个问题就来了,如何才能找到数据在内存中的地址?这个问题其实很简单,因为数组在内存中是一组连续的数据集合,所以我们只要知道数组首地址,然后通过对应字节长度的加减就可以找到对应字节数的数据,有了这些就可以定义出我们的数组,但是,作为一个合理的数组,还应该有数组长度的标志len和数组有效元素的标志cnt。由此给出对数组的定义(本例中采用结构体,对结构体不了解的朋友可以去查一下)
struct Arr
{
int *pBase; //存储的是数组的第一个元素的地址
int len; //数组所能容纳的最大元素的个数
int cnt; //数组有效元素的个数
};
上述代码定义了一个struct Arr的结构体,这个结构体就是一个数组,其中有存储数组元素中首地址的成员,有存储数组长度和数组有效元素个数的成员。
有了对结构体的定义之后,就应该涉及到对数组的基本操作,包括数组的初始化,判断数组是否为空,对数组进行显示,判断数组是否已满,对数组的最后追加一个元素,对数组元素的插入。其中,主要的算法就是对数组元素的插入,插入算法的核心就是首先应该先将被插入及插入位置之后的元素后移,然后将空出来的位置插入我们要插入的元素。一下给出c语言的实现:
/*
数组初始化函数
初始化仅仅是给出一个具有一定长度的数组,但是数组中没有有效值
*/
void init_arr(struct Arr * pArr,int len)
{
pArr->pBase=(int *)malloc(sizeof(int)*len);
if(NULL==pArr->pBase){
printf("动态内存分配失败");
exit(-1); //终止整个程序
}
else{
pArr->len=len;
pArr->cnt=0;
}
}
/*
判断数组是否为空的函数
*/
int is_empty(struct Arr * pArr){
if(pArr->cnt==0){
return 0; //0代表true
}
else{
return 1; //1代表false
}
}
/*
数组输出显示函数
在进行数组输出时,首先应该判断数组是否为空
*/
void show_arr(struct Arr * pArr){
if(is_empty(pArr)==0){
printf("当前数组为空!");
}
else{
int i;
for(i=0; i<pArr->cnt; ++i){
printf("%d ",pArr->pBase[i]);
}
printf("\n");
}
}
/*
判断数组是否已满的函数
*/
int is_full(struct Arr * pArr){
if(pArr->cnt==pArr->len){
return 0; //0代表true,表示已满
}
else{
return 1; //1代表false,表示未满
}
}
/*
在数组的最后追加一个元素
在追加数组元素前要判断当前数组是否已满,已满时不允许追加新的元素
*/
int append_arr(struct Arr *pArr,int val){
if(is_full(pArr)==0){
return 0;
}
else{
pArr->pBase[pArr->cnt]=val;
pArr->cnt++;
return 1;
}
}
/*
在数组的指定位置插入元素
插入算法:首先将被插入位置的元素全部后移,然后再将空出来的位置插入。
根据算法原理,所以,在插入的时候应该检查数组是否已满。
上述两种情况均合理时,进行数据的插入,插入时,若插入第三个位置,实际是将数据赋值给arr[pos-1]
注意:再将插入位置后的元素后移时,应该从后向前移动。否则,将会造成“被移到”的位置的值被覆盖
*/
int insert_arr(struct Arr *pArr,int pos,int val){
if(is_full(pArr)==0){
return 0; //0表示当前数组已满,无法再进行插入
}
//在数组可插入的情况下,应该检查用户输入的pos位置值是否合理
if(pos<0||pos>(pArr->len)){
return 1; //1表示当前用户插入位置不合法
}
//移动位置
int i;
for(i=pArr->cnt -1;i>=pos-1;--i){
pArr->pBase[i+1]=pArr->pBase[i];
}
//空缺位置插入元素
pArr->pBase[pos-1]=val;
return 2; //2表示当前插入成功
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# 数据结构
# 数组
# C语言
# 数据结构数组
# C语言数组按协议存储与按协议解析数据的实现
# C语言实现数据结构串(堆分配存储表示法)实例详解
# C语言 数据结构堆排序顺序存储(升序)
# C语言二进制思想以及数据的存储
# C语言 数据存储方式知识点详解
# 已满
# 就可以
# 为空
# 第一个
# 组中
# 将被
# 后移
# 当我们
# 涉及到
# 再将
# 自己的
# 的是
# 有效值
# 就会
# 来了
# 将会
# 两种
# 这个问题
# 有一定
相关文章:
一键网站制作软件,义乌购一件代发流程?
网站制作话术技巧,网站推广做的好怎么话术?
济南企业网站制作公司,济南社保单位网上缴费步骤?
Swift中swift中的switch 语句
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何在IIS管理器中快速创建并配置网站?
宝塔面板创建网站无法访问?如何快速排查修复?
音乐网站服务器如何优化API响应速度?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
,石家庄四十八中学官网?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何零成本快速生成个人自助网站?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何通过万网虚拟主机快速搭建网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何快速生成橙子建站落地页链接?
黑客如何利用漏洞与弱口令入侵网站服务器?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
广州美橙建站如何快速搭建多端合一网站?
如何选择CMS系统实现快速建站与SEO优化?
如何在橙子建站中快速调整背景颜色?
建站之星备案是否影响网站上线时间?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
常州自助建站工具推荐:低成本搭建与模板选择技巧
安云自助建站系统如何快速提升SEO排名?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站之星各版本价格是多少?
c# await 一个已经完成的Task会发生什么
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何通过宝塔面板实现本地网站访问?
Python lxml的etree和ElementTree有什么区别
如何选择美橙互联多站合一建站方案?
建站主机SSH密钥生成步骤及常见问题解答?
如何打造高效商业网站?建站目的决定转化率
如何选择香港主机高效搭建外贸独立站?
建站之星代理商如何保障技术支持与售后服务?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在阿里云高效完成企业建站全流程?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
*请认真填写需求信息,我们会在24小时内与您取得联系。