程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 在C語言中大概實現VC++中的LISTARRAY功能方法(二)

在C語言中大概實現VC++中的LISTARRAY功能方法(二)

編輯:關於C語言

上一篇: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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved