数据结构基础(1)--数组C语言实现--动态内存分配

数据结构基础(1)--数组C语言实现--动态内存分配

基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(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) 可以直接根据下标找到内存位置

缺点:

事先必须知道数组的长度

插入删除元素很慢

空间通常是有限制的

需要大块连续的内存块

插入删除元素的效率很低

[cpp] view plain copy

  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. }

原文地址:https://www.cnblogs.com/tianqiang/p/8744349.html

时间: 2024-12-23 14:55:30

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

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

动态内存分配 传统数组的缺点: 1数组长度必须事先制定,且仅仅能是长整数不能是变量 2传统形式定义的数组该数组的内存程序无法手动释放 3数组一旦定义,系统就会为该数组分配的存储空间就会一直存在直到该函数执行结束 4数组的长度不能再函数的执行的过程中动态的扩充或者缩小 5不能跨函数使用 为什么须要动态分配内存 动态内存分配内存举例--动态数组的构造 静态内存分配和动态内存分配 跨函数使用内存的问题 #include<stdio.h> void f(void) { int a[5]={0,1,2,

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

C语言学习笔记--动态内存分配

1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* mallo

数据结构-c语言内的内存分配

常用到的数据存储区: 在C语言中,根据数据在内存中存在的时间(生存期)不同,将内存空间分为三个区: 1.程序区:用于存储程序的代码,即程序的二进制代码: 2.静态存储区:用于存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了: 3.动态存储区:用于在程序执行时分配的内存,又分为:堆区(heap)和堆栈区(stack)两种. 堆区:用于动态内存分配,程序运行时由内存分配函数在堆上分配内存.在C语言中,只要使用指针才能动态的分配内存. 堆栈区:在函数执行时,函数内部的局部变量和函数参数

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化.使用.释放. 内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size)). 关于malloc函数应该注意一下几点: 1.malloc的參数就是须要分配的内存的字节数. 2.malloc所分配的是一块连续的内存. 3.分配成功.则返回指向分配内存起始地址

一维和二维数组 动态内存分配

一维数组的动态内存分配 #include "stdafx.h" #include <iostream> using namespace std; int main() { int length,i; int *p; cin>>length; p=new int[length]; for(i=0;i<length;i++) { p[i]=i; //不要写成*p[i]=i; cout<<p[i]<<endl; //不要写成cout<

C++二维数组动态内存分配

对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是通过a我们能找到这五个元素.注意:a是代表数组第一个元素的首地址.&a是代表数组的地址,虽然它们的值相同. 指针: int *p = NULL:这里p是一个指针,它指向的是计算 机内一块存储int类型的内存.P = a;就是让p等于刚才申请的数组的第一个元素的地址.所以通过p我们也能找到

动态内存分配(c语言)

当声明一个数组时,它所需要的内存将在编译时就被分配.但是,数组的长度在运行时才知道.它所需要的空间取决于输入的数据.所以,存在某一个数组实际所占的内存超过编译器所分配的内存.这时候,程序就会出现问题.所以,我们可以使用动态内存分配.所谓动态内存分配即为在运行时为它分配内存. 动态内存分配函数有:malloc,calloc,realloc,free. 函数所在的头文件:#include <stdlib.h> 函数原型: void *malloc( size_t size );//字节数 void

c++第十二章 -(动态管理内存、动态数组和函数返回动态内存)

1.静态内存,编译时申请,存储在栈,如基本数据类型. 2.动态内存由一些没有名字,只有地址的内存块构成.那些内存块是在程序运行期间动态分配的.它们来自一个标准c++库替你管理的“大池子”(内存池),从内存池申请一些内存需要用new语句,他将根据你提供的数据类型分配一块大小适当的内存.你不必担心内存块的尺寸问题. 3.注意在用完内存块之后,应该用delete语句把它返还内存池.另外作为一种附加的保险措施,在释放内存之后还要把关联的指针置NULL,对空指针进行“解引用”会报错. class Comp