問乙個問題,如果需要頻繁且長時間的增刪資料元素應該選擇哪種線性表?首先看到大量增刪肯定會想到單鏈表,因為它不需要移動結點,效率會高不少,但是單鏈表真的是理想的選擇嗎?如果需要的資料最大個數是固定的呢?這就是需要實現靜態單鏈表的原因之一。
當我們使用單鏈表長時間並且頻繁的增刪資料元素會發生什麼?可能的結果就是產生大量的堆空間記憶體碎片,因為結點空間都是單個申請和釋放的,長時間下來必定會導致堆空間逐漸變得碎片化,最終導致系統執行緩慢甚至崩潰。
靜態單鏈表就是一種新型線性表,在原先的單鏈表的內部增加一片預留的空間,所以的node物件都在這片空間中動態建立和動態銷毀。這片連續的記憶體可以來自於堆、棧、全域性區。當需要增加結點時就在這片空間中找到乙個空閒的空間然後作為結點空間,當不需要時直接標記這片空間為可用即可。
那麼靜態單鏈表既有順序表的固定長度特性又有單鏈表動態增刪的特性了。
那麼我們該如何實現呢?由於和單鏈表不同的地方僅在於結點空間申請和釋放的方式不同而已,所以我們只需實現create和destroy函式的重寫即可。所以它需要繼承自linklist類。
那麼具體實現思路呢?
首先通過類模板實現staticlinklist類。
在類中定義固定大小的空間。
重寫create和destroy函式,改變記憶體的分配和歸還方式。
在node類中過載operator new,用於在指定記憶體上建立物件。
下面看staticlinklist類的宣告:
template class staticlinklist : public linklist
};unsigned char m_space[sizeof(snode) * n];
int m_used[n];
node* create();
void destroy(snode* pn);
public:
staticlinklist();
int capacity();
};
首先使用typedef將linklist類裡的node使用起來,為什麼需要這樣的寫法呢,在linklist類中的node牽扯到了泛指型別,所以 不能直接在子類中使用父類的成員變數,所以需要linklist:: node,但是這樣正確了嗎?不是的,因為此時編譯器在編譯時不知道這種寫法到底是一種型別還是靜態變數,所以就需要typename來提示編譯器這是一種型別了,為了簡潔,所以用了typedef來重新命名。
然後定義乙個類snode,繼承自node,然後在類裡實現new的過載,即返回需要建立結點的返回位址。為什麼定義snode?因為node裡含有泛指型別t,當t為類型別時必然就會牽涉建構函式的呼叫。當我們在建立結點時分配好可用的空間後,我們分配好記憶體後在**呼叫建構函式呢?所以我們就需要過載new了。即返回需要呼叫建構函式的位址。
第三步是設定一片記憶體空間用來給定靜態單鏈表的固定空間。
第四步設定乙個陣列來標識空間是否可以。
然後就是實現create和destroy的重寫了。
create的實現:
node* create()
}return ret;
}
原理是先遍歷尋找可用空間,再進行分配空間,找到了就標記一下退出遍歷。
destroy的實現:
void destroy(node* pn)
}}
它的主要作用就是歸還空間。
staticlinklist建構函式實現:
staticlinklist()
}
將所有記憶體單元標記成可用。
capacity的實現:
int capacity()
最後來乙個獲取最大容量的實現。
小結:順序表和單鏈表結合衍生出靜態單鏈表。
靜態單鏈表是linklist的子類。
靜態單鏈表在預留的空間中建立和刪除結點物件。
靜態單鏈表適合於頻繁增刪資料元素且最大元素個數固定的場合。
資料結構單鏈表
初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...
資料結構 單鏈表
今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...
資料結構 單鏈表
實現乙個單鏈表 1 查詢 查詢第index個節點 查詢指定的元素 2 插入 將指定的元素插入到第index個節點上 3 刪除 將第index個節點刪除 規律 刪除和新增元素前務必儲存兩個元素的位址引用資訊 public class mylinkedlist 記錄鍊錶結構的頭結點位址引用 privat...