1. 程式人生 > >C實現JAVA類似ArrayList的靜態連結庫

C實現JAVA類似ArrayList的靜態連結庫

檔案結構:

  • ArrayList.h:標頭檔案
  • ArrayList.c:實現標頭檔案中的功能
  • ArrayListTest.c:測試

ArrayList.h

標頭檔案的基本框架:

#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H
// 標頭檔案體
#endif

標頭檔案中應包含結構體定義,必要的巨集定義,需要直接在其他檔案中使用的函式的定義

Java中的ArrayList是實現引用的陣列,而不是物件的陣列,在連續的儲存空間中存放的是引用,而不是物件實體,所以在實現的時候採用void**,那麼這樣實現的ArrayList將可以含有任意型別的變數,壞處就是需要在使用的時候人為的解析

capacity是當前item_list申請的長度

my_size是當前item_list中存放了多少個元素。之所以不用size是為了和接下來實現的size函式區別

為實現通過結構體通過呼叫成員的方式呼叫函式,而不是直接通過函式名呼叫函式。在結構體中宣告函式指標用以呼叫函式。這樣就可以在ArrayList.c中將函式的作用域宣告為只有本檔案可見,避免和其他庫函式函式名衝突。但是因為結構體中包含這個檔案中函式的指標,仍然可以呼叫函式。

typedef struct ArrayList ArrayList;
struct ArrayList{
    void** item_list;
    int capacity;
    int my_size;

    // 函式指標
}

為實現函式指標的賦值,需要宣告初始化函式,在初始化函式中將函式指標賦值,所以這兩個函式就不能放到結構體中:

// create a new ArrayList
int init_ArrayList(ArrayList*);
// create a new ArrayList with specified capacity
int init_ArrayList_capacity(ArrayList*,int capacity);

ArrayList.c

包含標頭檔案,實現函式

因為這些函式無法知道是哪個結構體呼叫自己的,所以都需要將呼叫的結構體傳進去

ArrayListTest.c

包含標頭檔案

呼叫的方式類似:

al.retainAll(&al,aap+3,11);
al.trimToSize(&al);

原始碼地址:

https://github.com/biaoJM/C-Wheel-ArrayList