一般傳統鍊錶的物理結構,是由指標把乙個乙個的節點相互連線而成:
struct node其特點是按需分配節點,靈活動態增長。
struct node其特點是預先分配節點,並且如果需要鍊錶長度隨需增加,需要reallocation ,和vector類似。
下面就我自己的一些了解,談一下其優缺點與應用。
能要省些記憶體嗎?不見得;速度要快嗎?沒看出來,那麼為什麼要使用這種不那麼直觀的方式來實現鍊錶呢?
這裡第乙個例子針對上面第四點展開,其主要的應用在於id的分配與**,比如資料庫表中的每條記錄都需要乙個unique id,當你增增減減若干次之後,然後新建乙個表項,你該分配給它哪個id呢?
struct idnode這裡,因為鍊錶的值的型別與值域都與陣列的index相符,我們可以復用其值和next,從而只需乙個int陣列,而不是乙個idnode陣列,陣列中某個元素的值代表的即是鍊錶節點的值,也是鍊錶的下乙個節點下標。下面是乙個idallocator的實現,主要提供allocate和free兩個函式用來滿足上述要求:;
const static char list_end = -1;用陣列實現鍊錶,大多數情況下,是與傳統鍊錶類似的,無非是在新增、刪除節點後,調整previous,next域的指向。但是有一點,當我在新增乙個新的節點時,如何從陣列中拿到乙個還未被使用過的節點呢?這裡有兩種方法:template < typename integer>
class idallocator
array[num-1] = list_end;
count = num;
}~idallocator()
integer allocate() // pop_front, remove a node from the front
return id;
}// push_front, add a new node to the front
void free(const integer& id)
// push_front, add a new node to the front
bool free_s(const integer& id)
size_t size()
private:
bool exist(const integer& id)
return false;
}private:
integer* array;
int num;// totall number of the array
int count;// number in the linked list
int head;// index of the head of the linked list
};
第一種因為借助於乙個工具類,實現看起來會簡潔很多,但是idallocator會消耗額外的記憶體,因此第二種方法相對來講會比較好。
這裡有個粗略的實現:arraylist.
表 陣列 鍊錶
陣列 陣列是個表,是個連續儲存的表。在c裡面,首先我們知道陣列容量是固定的,使用前先分配大小,所以使用後就不是很方便調整容量 解決這個問題在c裡面一般是預先估計陣列的大小,然後用雙倍的容量建立陣列,是不是很麻煩?正因為陣列是連續儲存和容量固定,所以注定陣列不方便進行增刪這種改變容量的操作。原因是假如...
陣列模擬鍊錶(靜態鍊錶)
為了模擬鍊錶的操作,設定了乙個date 資料 以及cur 相當於指標域 typedef struct list list s size size為陣列大小 我們用s size 1 cur來起頭指標的作用,指向鍊錶的第乙個元素的下標。因為不能直接malloc出來乙個空間,需要s 0 來儲存乙個空的陣列...
陣列 鍊錶 Hash
在程式中,存放指定的資料最常用的資料結構有兩種 陣列和鍊錶。陣列和鍊錶的區別 1 陣列是將元素在記憶體中連續存放。鍊錶中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。2 陣列必須事先定義固定的長度,不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數 當資料減...