C语言 数据结构之连续存储数组的算法

 更新时间:2017年01月11日 10:51:16   投稿:lqh  
这篇文章主要介绍了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++实现控制台版的扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Qt+Live555搭建RTSP服务器的方法步骤

    Qt+Live555搭建RTSP服务器的方法步骤

    本文主要介绍了Qt+Live555搭建RTSP服务器的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 详解C语言中的常量指针和指针常量

    详解C语言中的常量指针和指针常量

    这篇文章主要介绍了详解C语言中的常量指针和指针常量,包括其之间的区别是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++实现判断一个字符串是否为UTF8或GBK格式的方法

    C++实现判断一个字符串是否为UTF8或GBK格式的方法

    这篇文章主要介绍了C++实现判断一个字符串是否为UTF8或GBK格式的方法,涉及C++针对字符编码的遍历、判断、编码转换等相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • C语言基于单链表实现通讯录功能

    C语言基于单链表实现通讯录功能

    这篇文章主要为大家详细介绍了C语言基于单链表实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • java string对象上的操作,常见的用法你知道吗

    java string对象上的操作,常见的用法你知道吗

    今天给大家带来的是关于Java的相关知识,文章围绕着Java String类用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-08-08
  • 浅谈C++的语句语法与强制数据类型转换

    浅谈C++的语句语法与强制数据类型转换

    这篇文章主要介绍了浅谈C++的语句语法与强制数据类型转换,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言实现BF算法案例详解

    C语言实现BF算法案例详解

    这篇文章主要介绍了C语言实现BF算法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • VC++实现模拟汉诺塔效果

    VC++实现模拟汉诺塔效果

    本文给大家分享的是一则使用vc++实现模拟汉诺塔效果的代码,代码实现起来很简单,主要是汉诺塔算法的思路要正确,正在练习汉诺塔的小伙伴也可以来看看,希望大家能够喜欢。
    2015-03-03
  • C语言文件操作函数freopen详细解析

    C语言文件操作函数freopen详细解析

    替换一个流,或者说重新分配文件指针,实现重定向。如果stream流已经打开,则先关闭该流。如果该流已经定向,则freopen将会清除该定向。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错
    2013-10-10

最新评论