数据结构之数组定义及基本操作(转)
数据结构之数组定义及基本操作数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题。首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中。当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据。了解了以上知识后,我们就可以进行数组的设计了(我们就可以设计自己的数组供别人去使用了,哈哈)。了解了以上知识后,第一个问题就来了,如何才能找到数据在内存中的地址?这个问题其实很简单,因为数组在内存中是一组连续的数据集合,所以我们只要知道数组首地址,然后通过对应字节长度的加减就可以找到对应字节数的数据,有了这些就可以定义出我们的数组,但是,作为一个合理的数组,还应该有数组长度的标志len和数组有效元素的标志cnt。由此给出对数组的定义(本例中采用结构体,对结构体不了解的朋友可以去查一下)复制代码 1 struct Arr 2 { 3 int *pBase; //存储的是数组的第一个元素的地址 4 int len; //数组所能容纳的最大元素的个数 5 int cnt; //数组有效元素的个数 6 7 }; 复制代码 上述代码定义了一个struct Arr的结构体,这个结构体就是一个数组,其中有存储数组元素中首地址的成员,有存储数组长度和数组有效元素个数的成员。有了对结构体的定义之后,就应该涉及到对数组的基本操作,包括数组的初始化,判断数组是否为空,对数组进行显示,判断数组是否已满,对数组的最后追加一个元素,对数组元素的插入。其中,主要的算法就是对数组元素的插入,插入算法的核心就是首先应该先将被插入及插入位置之后的元素后移,然后将空出来的位置插入我们要插入的元素。一下给出c语言的实现:复制代码1 /*2 数组初始化函数 3 初始化仅仅是给出一个具有一定长度的数组,但是数组中没有有效值 4 */5 void init_arr(struct Arr * pArr,int len)6 {7 pArr->pBase=(int *)malloc(sizeof(int)*len);8 if(NULL==pArr->pBase){9 printf("动态内存分配失败"); 10 exit(-1); //终止整个程序 11 } 12 else{ 13 pArr->len=len; 14 pArr->cnt=0; 15 } 16 } 17 18 /* 19 判断数组是否为空的函数 20 */ 21 int is_empty(struct Arr * pArr){ 22 if(pArr->cnt==0){ 23 return 0; //0代表true 24 } 25 else{ 26 return 1; //1代表false 27 } 28 } 29 30 /* 31 数组输出显示函数 32 在进行数组输出时,首先应该判断数组是否为空 33 */ 34 void show_arr(struct Arr * pArr){ 35 if(is_empty(pArr)==0){ 36 printf("当前数组为空!"); 37 } 38 else{ 39 int i; 40 for(i=0; i<pArr->cnt; ++i){ 41 printf("%d ",pArr->pBase[i]); 42 } 43 printf("\n"); 44 } 45 } 46 47 /* 48 判断数组是否已满的函数 49 */ 50 int is_full(struct Arr * pArr){ 51 if(pArr->cnt==pArr->len){ 52 return 0; //0代表true,表示已满 53 } 54 else{ 55 return 1; //1代表false,表示未满 56 } 57 } 58 59 /* 60 在数组的最后追加一个元素 61 在追加数组元素前要判断当前数组是否已满,已满时不允许追加新的元素 62 */ 63 int append_arr(struct Arr *pArr,int val){ 64 if(is_full(pArr)==0){ 65 return 0; 66 } 67 else{ 68 pArr->pBase[pArr->cnt]=val; 69 pArr->cnt++; 70 return 1; 71 } 72 } 73 74 /* 75 在数组的指定位置插入元素 76 插入算法:首先将被插入位置的元素全部后移,然后再将空出来的位置插入。 77 根据算法原理,所以,在插入的时候应该检查数组是否已满。 78 上述两种情况均合理时,进行数据的插入,插入时,若插入第三个位置,实际是将数据赋值给arr[pos-1] 79 注意:再将插入位置后的元素后移时,应该从后向前移动。否则,将会造成“被移到”的位置的值被覆盖 80 */ 81 int insert_arr(struct Arr *pArr,int pos,int val){ 82 if(is_full(pArr)==0){ 83 return 0; //0表示当前数组已满,无法再进行插入 84 } 85 //在数组可插入的情况下,应该检查用户输入的pos位置值是否合理 86 if(pos<0||pos>(pArr->len)){ 87 return 1; //1表示当前用户插入位置不合法 88 } 89 //移动位置 90 int i; 91 for(i=pArr->cnt -1;i>=pos-1;--i){ 92 pArr->pBase[i+1]=pArr->pBase[i]; 93 } 94 //空缺位置插入元素 95 pArr->pBase[pos-1]=val; 96 return 2; //2表示当前插入成功 97 } 复制代码学习过程中的一些心得,拿出来记录一下,希望能对看到的朋友有所帮助,有错误的地方欢迎批评指出。
转载于:https://www.cnblogs.com/bytebee/p/8595905.html
数据结构之数组定义及基本操作(转)相关推荐
- 细说PHP笔记03(第7章)--数组与数据结构,数组定义,数组遍历,数组内部指针遍历,键值操作函数,统计数组函数,回调函数处理数组元素,数组排序,拆分、合并、分解、结合数组,数组实现堆栈,随机选取元素
1.数组 索引数组:索引值是整数 关联数组:索引值是字符串 2.数组的定义 1.以直接赋值的方式声明 $数组名[下标]=资料内容 或 $数组名[关联字符串(键值)]=资料内容 <?php $va ...
- 数据结构(C语言)——线性表(定义,基本操作)
数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...
- 数据结构-栈(Stack)-定义与基本操作
数据结构-栈(Stack)-定义与基本操作 一. 顺序栈(Sequential Stack) 1. 定义 2. 基本操作 2.1 初始化 2.2 进栈 2.3 出栈 2.4 取栈顶元素 2.5 判空 ...
- 数据结构(C语言)顺序表的定义及基本操作
顺序表的定义及基本操作 一.数据结构:顺序表的定义,创建,基本运算,实现 二.全部代码 定义顺序表 #include<stdio.h> #include<malloc.h> # ...
- 数据结构(C语言)中双向链表的定义及基本操作
一.双向链表的定义及基本操作 单链表中的结点只有一个指向其后继的指针,使得单链表要访问某个结点的前驱结点时,只能从头开始遍历,而双向链表的话 可以直接访问结点的后继结点和前驱结点. 双链表的结点中有 ...
- 数据结构之数组及动态数组剖析
数据结构之数组及动态数组剖析 文章目录 数据结构之数组及动态数组剖析 概述 动态数组实现的原理 实践编写动态数组类 时间复杂度分析 数组对数器 参考代码 相关链接 公众号 参考 概述 数组是在程序设计 ...
- Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...
- 数据结构之数组和链表的区别
第一题便是数据结构中的数组和链表的区别 数组(Array) 一.数组特点: 所谓数组,就是相同数据类型的元素按一定顺序排列的集合:数组的存储区间是连续的,占用内存比较大,故空间复杂的很大.但数组的二分 ...
- python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型
前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...
最新文章
- 算法竞赛知识合集 目录(博客中转站)
- Java Spring源代码学习之How is class annotation evaluated by Spring framework
- php-fpm和php,phpcgi和phpfpm的区别是什么
- linux运行雷神之锤,Ubuntu18.04下可以完美运行Quake3..
- SQL Server中的万圣节问题和建议的解决方案
- file watchers怎么默认打开_python怎么打印字符
- 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)
- pythoon介绍、安装环境、基础知识、练习题
- Spring IoC-02
- 后缀的形容词_4.1.3后缀or形容词比较级【p78】
- 【sketchup 2021】草图大师的编辑工具1【移动工具、旋转工具、缩放工具】
- SpringBoot 一文搞懂Spring JPA
- vscode调用keil-MDK编译程序
- 2012文件共享服务器权限,局域网共享设置权限server2012r2文件共享权限设置方法...
- html显示当前小时分钟秒秋,北语18秋《网页制作》作业1234
- 点击微信内网页a标签直接跳转打开淘宝APP的方法实例
- C语言——简单图形打印学习
- 三维数组matlab怎么画图,三维数组画图遇到问题
- 放弃了又何需执着 ?
- 微电影剪辑就用会声会影