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

  数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。

  数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题。首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中。当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据。了解了以上知识后,我们就可以进行数组的设计了(我们就可以设计自己的数组供别人去使用了,哈哈)。

  了解了以上知识后,第一个问题就来了,如何才能找到数据在内存中的地址?这个问题其实很简单,因为数组在内存中是一组连续的数据集合,所以我们只要知道数组首地址,然后通过对应字节长度的加减就可以找到对应字节数的数据,有了这些就可以定义出我们的数组,但是,作为一个合理的数组,还应该有数组长度的标志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 }

  学习过程中的一些心得,拿出来记录一下,希望能对看到的朋友有所帮助,有错误的地方欢迎批评指出。

时间: 2024-10-28 10:05:24

数据结构之数组定义及基本操作的相关文章

数据结构之队列定义及基本操作实现

数据结构学着就是有意思,真诚推荐郝斌老师的数据结构视频,真的讲解的非常详细,容易理解. 一直在跟着郝斌老师的数据结构视频学习,看完了队列的视频,记录下来,总结一下. 队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列.进行插入操作的一端称为队尾,进行删除操作的一端称为队尾. 队列的类型:链式队列,即用链表实现的队列.静态队列:即用数组实现的队列.在这里,我们采用用数组实现的静态队列.因为用链表实

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

数据结构 【实验 串的基本操作】

一.实现主要功能为: 1.输入模式串.目标串 2.根据目标串生成next[]和nextval[]数组 3.根据next[]或者nextval[]进行匹配. 二.程序截图: 三.代码: 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 #define MAXSIZE 1000 //最大

数据结构--二叉树(定义与存储结构)

什么是二叉树 是具有n个节点的有限集合,由一个根节点和两棵互不相交二叉树组成.如图 从名字简单理解,就是具有2个树叉的树形结构,当然这不是绝对的,正如上图所示,我也可以只有一个树叉. 二叉树具有五种基本形态: (1)空二叉树 (2)只有一个根结点的二叉树 (3)只有左子树 (4)只有右子树 (5)既有左子树又有右子树 完全二叉树 这种二叉树,是二叉树中常用的专业术语,不是说一个完整的二叉树就是完全二叉树,这种二叉树叫满二叉树,如图 简单理解就像图片中,完全二叉树中每个节点的编号,都能映射到满二叉

数据结构 【实验7 二叉树基本操作】

实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 实验内容 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作.该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数. /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct Bit

数据结构--树(定义与存储结构)

树基本定义 树的定义 数是具有n个节点的有限集.如图即是一个树形结构. 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2. 叶节点(终端节点):没有子节点的节点,比如G.H.I.... 如图: 节点间关系 孩子节点:某一个节点的子节点称为孩子节点.比如B.C节点是A节点的孩子节点. 双亲节点:与孩子节点相反.比如,A节点是B.C的双亲节点. 兄弟节点:同一个双亲节点的孩子节点,之间称为兄弟节点.比如,B.C为兄弟节点. 如图: 树的存储结

JS数组定义及详解

## 1.什么是数组 ## 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 ## 2.关于js中的数组特点 ## 数组定义时无需指定数据类型 数组定义时可以无需指定数组长度 数组可以存储任何数据类型的数据(比如说一个元素保存整型,一个元素保存字符串型,这个在JS中是可以的) ### 创建数组的语法: ### var arr=[值1,值2,值3]; //隐式创建 var arr=new Array(值1,值2,值3); //直接实例化 var

verilog数组定义及其初始化

这里的内存模型指的是内存的行为模型.Verilog中提供了两维数组来帮助我们建立内存的行为模型.具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问.这样的数组的定义方式如下: reg [wordsize : 0] array_name [0 : arraysize]; 例如: reg [7:0] my_memory [0:255]; 其中 [7:0] 是内存的宽度,而[0:255]则是内存的深度(也就是有多少存储单元),其中宽度为8位,深度为25

shell数组定义和操作

这是某天晚上自己闲来没事学习solr的时候忽然看见数组的定义,想转发一个比较详细的数组操作. 1.数组定义 a=(1 2 3 4 5) echo $a 一对括号表示是数组,数组元素用"空格"符号分割开. 2.数组读取与赋值 得到长度: echo ${#a[@]}5 用${#数组名[@或*]} 可以得到数组长度 读取: echo ${a[2]} 3 echo ${a[*]} 1 2 3 4 5 用${数组名[下标]} 下标是从0开始  下标是:*或者@ 得到整个数组内容 赋值: a[1]