本代碼提供對動態數組的支持,在內存中程序將數據分塊存放,避免了大塊內存的申請。同時,與普通的雙向鏈表不同,本代碼提供了對內部數據的快速索引,大大提高了數據訪問速度。本代碼提供C、C++兩個版本,可以任意使用、修改、傳播。下面是動態數組結構示意圖:
圖一
數據結構:
本模塊核心是一個對雙向鏈表的擴展,它通過一個可以指向任意數據類型的指針(在C語言版中是一個void *,在C++中是一個模板)實現了對任意數據類型的處理。鏈表中的節點中的data域是真正存放數組中數據的緩沖區的指針,該緩沖區的大小(必須是一個正整數)一個需要在程序開始時根據實際需要設定,例如目標數據量在0到100個左右,可以將它設成10等(設太小在添加數據時需要頻繁為數據分配空間,太大容易造成內存的浪費),這個時候如果數據量在51到60之間,鏈表中將包含6個數據節點。
數據接口:(以C++語言版為例)//******************************************
代碼下載
// name:Add
// function:添加數據
// input: T newElement-新數據
// return: 數據索引號
// remark:
//******************************************
int Add(T newElement).
//******************************************
// name:AddBatch
// function:批量添加數據
// input: T *pElement-源數組指針
// int count-數組大小
// return: BOOL TRUE-成功;FALSE-失敗
// remark:
//******************************************
BOOL AddBatch(T *pElement,int count).
//******************************************
// name:Copy
// function:數據復制
// input: CSArray & src-源動態數組
// return:
// remark: 使用前請先確保兩個對象有相同的數據類型
//******************************************
void Copy(CSArray &src ).
//******************************************
// name:GetAt
// function:獲取數組指定位置的數據
// input: int index-指定位置
// return: T 數據
// remark:
//******************************************
T GetAt(int index).
//******************************************
// name:GetPtAt
// function:獲取數組指定位置的數據的指針
// input: int index-指定位置
// return: T 數據
// remark: 提供對內部數據的直接訪問,小心使用!!
//******************************************
T *GetPtAt(int index).
//******************************************
// name:GetSize
// function:獲取數組的數據容量
// input:
// return: int 數據容量
// remark:
//******************************************
int GetSize().
//******************************************
// name:SetAt
// function:修改數組指定位置的數據
// input: T newElement-新數據
// int index-指定索引號
// return: BOOL TURE-成功;FALSE-失敗
// remark:
//******************************************
BOOL SetAt(int index,T &newElement).
//******************************************
// name:InsertAt
// function:在數組指定位置插入一個新數據
// input: int index-指定索引號
// T newElement-待插入的數據
// return: BOOL TURE-成功;FALSE-失敗
// remark: 本接口關系到大量數據的遷移,不推薦大量使用
// 算法還有待進一步優化
//******************************************
BOOL InsertAt(int index,T newElement).
//******************************************
// name:RemoveAt
// function:刪除數組中指定索引號中包含的數據
// input: int index-指定索引號
// return: BOOL TURE-成功;FALSE-失敗
// remark: 本接口關系到大量數據的遷移,不推薦大量使用
// 算法還有待進一步優化
//******************************************
BOOL RemoveAt(int index)
//******************************************
// name:RemoveAll()
// function:清空對象中的數據
// input:
// return: BOOL TURE-成功;FALSE-失敗
// remark:
//******************************************
BOOL RemoveAll().
//******************************************
// name:SetSize()
// function:設置數據的容量
// input: int size -數據的容量
// return: BOOL TURE-成功;FALSE-失敗
// remark:只允許擴大容量
//******************************************
BOOL SetSize(int size)
1、 C語言版(模擬C++的模板及面向對象方法):fteb_array.zip
2、 C++語言版:sarray.zip
本文配套源碼