1. 程式人生 > >數據結構基礎(1)--數組C語言實現--動態內存分配

數據結構基礎(1)--數組C語言實現--動態內存分配

ins post cli itl ini sem pri 應該 insert

數據結構基礎(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. }

數據結構基礎(1)--數組C語言實現--動態內存分配