上一篇:http://www.BkJia.com/kf/201206/136582.html
1. #ifndef __LISTARRAY_H__
2. #define __LISTARRAY_H__
3. #include "rtthread.h"
4. #include "finsh.h"
5.
6. #define LISTDEFAULTSIZE 20
7. #define LISTCHANGESIZE 10
8.
9. //LIST數組
10. typedef struct _List List;
11. struct _List
12. {
13. void **pListPointArray; //LIST數組指針
14. int Total; //元素個數
15. int ChangeSize; //每次改變容量的時候容量的大小
16. int Size; //當前容量
17. void (*Add)(List *pList, void *pListPoint); //添加
18. void (*Remove)(List *pList, void *pListPoint); //移除
19. void (*Delete)(void *pList); //析構
20. };
21. //List類的析構函數
22. static void ListDelete(void *pList)
23. {
24. rt_free(((List *)pList)->pListPointArray);
25. rt_free(pList); //再釋放整個List類
26. }
27. //元素增加函數
28. static void ListAdd(List *pList, void *pListPoint)
29. {
30. void **tListPointArray;
31. if(pList->Size == pList->Total) //如果空間已滿
32. {
33. pList->Size = pList->Size + pList->ChangeSize; //改變空間的尺寸
34. tListPointArray = rt_malloc(sizeof(int *) * pList->Size); //重新申請內存
35. memcpy(tListPointArray, pList->pListPointArray, sizeof(int *) * pList->Total); //將原內存的數據拷到新內存
36. rt_free(pList->pListPointArray); //釋放原空間
37. pList->pListPointArray = tListPointArray; //將新空間指針代替原空間指針
38. }
39. pList->pListPointArray[pList->Total] = pListPoint; //將添加的元素放到最後一個存儲單元中
40. pList->Total++; //個數加1
41. }
42. //元素移除函數
43. static void ListRemove(List *pList, void *pListPoint)
44. {
45. int pListIndex, tListIndex;
46. void **tListPointArray;
47. if(pList->Total == 0) return; //總數為0時退出
48. for(pListIndex = 0, tListIndex= 0; pListIndex < pList->Total; pListIndex++) //查找移除點
49. {
50. if(pList->pListPointArray[pListIndex] != pListPoint) //當前點不是移除點
51. {
52. pList->pListPointArray[tListIndex] = pList->pListPointArray[pListIndex]; //拷貝
53. tListIndex++; //拷貝序號加1
54. }
55. }
56. pList->Total = tListIndex;
57.
58. if(pList->Total <= (pList->Size - pList->ChangeSize))
59. {
60. pList->Size = pList->Size - pList->ChangeSize; //改變內存尺寸
61. tListPointArray = rt_malloc(sizeof(int *) * pList->Size); //申請新內存
62. memcpy(tListPointArray, pList->pListPointArray, sizeof(int *) * pList->Total);//拷貝數據
63. rt_free(pList->pListPointArray); //釋放原空間
64. pList->pListPointArray = tListPointArray; //將新空間指針代替原空間指針
65. }
66. }
67. //List構造函數
68. static List *ListCreate(void)
69. {
70. List *pList = (List *)rt_malloc(sizeof(List));
71. pList->Total = 0;
72. pList->Size = LISTDEFAULTSIZE;
73. pList->ChangeSize = LISTCHANGESIZE;
74. pList->pListPointArray = rt_malloc(LISTDEFAULTSIZE);
75. pList->Add = ListAdd;
76. pList->Remove = ListRemove;
77. pList->Delete = ListDelete;
78. return pList;
79. }
80. #endif
此方法是由方法1發展而來,在方法1中添加了兩個參數,一個是SIZE參數,一個是CHANGESIZE參數,SIZE參數是初始化時的數組容量,CHANGESIZE是在數據剛好達到SIZE時將數組容量改變的數組添加或減少的容量。比如初始大小為SIZE,然後當數組增加到SIZE的時候要存儲第SIZE + 1個數據的時候就重新申請一塊比SIZE大CHANGESIZE的內存,然後再將數據轉移進去,將原內存釋放,將新內存的指針保存。減少是一個道理的,當減到SIZE的時候,將原尺寸減個CHANGESIZE,然後申請內存,轉移數據,釋放老內存,保存新指針。
此方法的好處是不用每次都申請、釋放內存、轉移數據,操作LIST比較頻繁的時候,用此方法比用第1種方法在速度上有優勢!
作者:sx_wpc