基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc()。

难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定。规律:

1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动)

for( i=cnu;i>=pos;i--)

pBase[i]=pBase[i-1];

2.删除数组第pos位置的元素

for(i=pos+1;i<=cnu;i--)

pBase[i-2]=pBase[i-1];

使用malloc动态分配内存并将返回值赋给整形指针

int *pBase=(int *)malloc(sizeof(int)*len);//分配4*len字节长度的内存

这是pBase可以指向数组中的第一个元素,可以作为数组变量名称使用。

数组的优缺点:

优点:

存取速度快 o(1) 可以直接根据下标找到内存位置

缺点:

事先必须知道数组的长度

插入删除元素很慢

空间通常是有限制的

需要大块连续的内存块

插入删除元素的效率很低

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<stdbool.h>
  4. struct Arr{
  5. int len;//数组能存取的最大元素个数
  6. int cnu;//数组中当前元素个数
  7. int * pBase;//存储指向数组的指针
  8. };
  9. /**
  10. *初始化数组
  11. */
  12. void init_array(struct Arr * pArray,int len){
  13. pArray->pBase=(int *)malloc(sizeof(int)*len);//分配4*len字节长度的内存
  14. if(NULL== pArray->pBase)//判断内存是否分配失败
  15. {
  16. printf("动态分配内存失败\n");
  17. // exit(-1);
  18. }else{
  19. pArray->len=len;
  20. pArray->cnu=0;
  21. }
  22. return ;
  23. }
  24. /**
  25. *判断数组是否为空,传地址省内存4字节,传结构体变量需要进行拷贝,12字节
  26. */
  27. bool isempty(struct Arr * pArray){
  28. if(0==pArray->cnu)
  29. {
  30. return true;
  31. }else{
  32. return false;
  33. }
  34. }
  35. /**
  36. **判断数组是否满了
  37. */
  38. bool isfull(struct Arr * pArray)
  39. {
  40. if(pArray->len==pArray->cnu)
  41. {
  42. return true;
  43. }else {
  44. return false;
  45. }
  46. }
  47. /**
  48. *显示数组内容
  49. */
  50. void show_array(struct Arr * pArray){
  51. if(isempty(pArray))
  52. printf("数组为空!\n");
  53. else{
  54. int i;
  55. for( i=0; i<pArray->cnu;i++)
  56. {
  57. printf("%d \n",pArray->pBase[i]);
  58. }
  59. printf("------------------------------------\n");
  60. }
  61. }
  62. /**
  63. **向数组追加元素
  64. */
  65. bool append(struct Arr * pArray,int val){
  66. if(isfull(pArray))
  67. {
  68. printf("数组已经满了!\n");
  69. return false;
  70. }else{
  71. pArray->pBase[pArray->cnu]=val;
  72. pArray->cnu++;
  73. }
  74. }
  75. /**
  76. **向数组中插入元素,pos为数组中第几个位置,pos=3就是向a[2]插入元素
  77. */
  78. bool insert(struct Arr * pArray,int pos,int val)
  79. {
  80. if(pos<1||pos>pArray->len+1)//插入的位置不能小于1,同时不能比最后一个元素大二
  81. {
  82. printf("插入的位置输入的不合法\n");
  83. return false;
  84. }
  85. if(isfull(pArray))
  86. {
  87. printf("数组已经满了,插入失败!\n");
  88. return false;
  89. }
  90. int i;
  91. //循环将pos位置开始的数组后移
  92. for(i=pArray->cnu;i>=pos;i--)
  93. //移动范围是从第pos个到底cnu个
  94. {
  95. pArray->pBase[i]=pArray->pBase[i-1];
  96. /**
  97. 若以i表示要移动元素的位置,从一开始的。右边都是i-1,若左移,左边是i-2,右移,左边是i
  98. */
  99. }
  100. pArray->pBase[pos-1]=val;
  101. pArray->cnu++;
  102. pArray->len++;
  103. return true;
  104. }
  105. /**
  106. **删除数组中的第pos个元素,同时返回删除的元素的值
  107. */
  108. bool delete(struct Arr * pArray,int pos,int * val)
  109. {
  110. if(pos<1||pos>pArray->cnu)
  111. {
  112. printf("删除失败,位置不合法\n");
  113. return false;
  114. }
  115. int i;
  116. *val=pArray->pBase[pos-1];
  117. for(i=pos+1;i<=pArray->cnu;i++)
  118. {
  119. //移动单位是从第pos+1个到cnu
  120. pArray->pBase[i-2]=pArray->pBase[i-1];
  121. }
  122. pArray->cnu--;
  123. return true;
  124. }
  125. /**
  126. **数组倒置
  127. */
  128. bool inverse(struct Arr * pArray)
  129. {
  130. if(isempty(pArray))
  131. {
  132. printf("倒置失败,因数组为空");
  133. return false;
  134. }
  135. int i=0;
  136. int j=pArray->cnu-1;
  137. int temp;
  138. while(i<j)
  139. {
  140. temp=pArray->pBase[i];
  141. pArray->pBase[i]= pArray->pBase[j];
  142. pArray->pBase[j]=temp;
  143. i++;
  144. j--;
  145. }
  146. return true;
  147. }
  148. int main()
  149. {
  150. struct Arr arr;
  151. init_array(&arr,6);//将结构体的地址作为实参,这样才能修改结构体中的值,如果传的是结构体变量,那么将进行拷贝,不会改变值
  152. append(&arr,1);
  153. append(&arr,2);
  154. append(&arr,3);
  155. append(&arr,4);
  156. show_array(&arr);
  157. insert(&arr,2,88);
  158. show_array(&arr);
  159. int val;
  160. delete(&arr,1,&val);
  161. show_array(&arr);
  162. printf("删除了 %d\n",val);
  163. inverse(&arr);
  164. show_array(&arr);
  165. return 0;
  166. }

数据结构基础(1)--数组C语言实现--动态内存分配的更多相关文章

  1. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  2. c++ 动态数组,指针与动态内存分配

    教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...

  3. 重拾c语言之动态内存分配

    动态内存分配 传统数组的缺点: 1数组长度必须事先制定,且仅仅能是长整数不能是变量 2传统形式定义的数组该数组的内存程序无法手动释放 3数组一旦定义,系统就会为该数组分配的存储空间就会一直存在直到该函 ...

  4. C++指针与数组、函数、动态内存分配

    C++指针 指针是用来存储地址的变量. 对于二维数组来说: a:代表的是首行地址: *a:代表的是首元素地址: **a:首元素: a+1:第二行地址: *a+2:首先*a是首元素地址,在首元素地址上+ ...

  5. C++语言之动态内存分配

    在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中: 存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配 ...

  6. 数据结构基础——指针及动态内存分配(malloc)

    一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...

  7. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  8. [C语言] 数据结构-预备知识动态内存分配

    动态内存分配 静态内存分配数组 int a[5]={1,2,3,4,5}  动态内存分配数组 int len=5; int *parr=(int *)malloc(sizeof(int) * len) ...

  9. C语言中动态内存的分配(malloc,realloc)

    动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...

随机推荐

  1. 详解php 获取文件名basename()函数的用法

    PHP 中basename()函数给出一个包含有指向一个文件的全路径的字符串,此函数返回基本的文件名,本篇文章收集了关于使用PHP basename()函数获取文件名的几篇文章,希望对大家理解使用PH ...

  2. 关于session销毁的问题,invalidate() 和removeAttribute()

    request.getSession().invalidate(); 销毁当前会话域中的所有属性 request.getSession().removeAttribute("username ...

  3. React-Native开发之BUG 总结

    本博客将详细记录在React-Native开发中所遇到的各种问题以及其解决方法. 个人感觉,React-Native开发初期真的是一脚一个大坑,分分钟被虐趴下. 不说了,直接上Bug 1.在Windo ...

  4. ubuntu安装zeromq

    官网地址:http://zeromq.org/ ubuntu下zmq安装 (1)下载:wget http://download.zeromq.org/zeromq-4.1.4.tar.gz (2)解压 ...

  5. 远程桌面报错解决:No Remote Desktop License Servers Available

    摘 要 用户发来反馈,使用部门Windows跳板机报错:The remote session was disconnected because there are no Remote Desktop ...

  6. Python学习---ModelForm拾遗180325

    ModelForm适用于前台验证和后台直接操作数据库的前后台未做分离,可以一次执行验证和保存数据的场景. 注意:  1.  ModelForm里面没有删除方法,需要手动删除内容 2. ModelFor ...

  7. 铁乐学python_day28_模块学习3

    大部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ OS模块复习一二 >>> import os >>> os.getcwd() ...

  8. 铁乐学python_md5校验两个文件的一致性

    # 写一个函数,参数是两个文件的路径 # 返回的结果是T/F # 判断两个文件的md5值是否相同 import hashlib def diff_md5(file1,file2): def chick ...

  9. 深入浅出SharePoint2013——获取Application Pool的id和name对照表

    PS C:\Users\Mingle> Get-SPServiceApplicationPool | select Id, Name Id Name-- ----f864f712-faa4-4a ...

  10. ZT 二叉树先序,中序,后序遍历非递归实现

    二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 ...