C语言 数据结构之连续存储数组的算法
数据结构之数组定义及基本操作
数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。
数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题。首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中。当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据。了解了以上知识后,我们就可以进行数组的设计了(我们就可以设计自己的数组供别人去使用了,哈哈)。
了解了以上知识后,第一个问题就来了,如何才能找到数据在内存中的地址?这个问题其实很简单,因为数组在内存中是一组连续的数据集合,所以我们只要知道数组首地址,然后通过对应字节长度的加减就可以找到对应字节数的数据,有了这些就可以定义出我们的数组,但是,作为一个合理的数组,还应该有数组长度的标志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语言 数据结构之连续存储数组的算法
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1824.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置