2010-06-22 140 views
4

我想編寫一個程序來序列化鏈接列表到一個文件,而不使用任何庫。我的問題是如何添加或刪除序列化結構的節點,因爲我沒有下一個指針?另外我怎樣才能避免碎片?需要一些序列化的幫助

+0

我想序列化一個鏈表結構。有人可以幫助我如何做到這一點。請不要使用外部庫。序列化應該用於添加節點並刪除文件中的節點。另外如何將結構轉換爲二進制,然後轉換爲鏈表。 (也有「下一個」指針)。也應該以什麼格式存儲它,以便我的文件可以保存多個鏈接列表。 – mousey 2010-06-23 02:50:05

+0

@mousey:我們已經過了這個:)你對我們的討論瞭解多少? – Stephen 2010-06-23 02:53:38

+0

@Stephen我沒有得到存儲它的格式。如果我想存儲一個涉及int數據的鏈表。我是否需要存儲像{int值和下一個結構的文件偏移量那樣的值?)或者如何維護文件中的結構格式 – mousey 2010-06-23 02:56:25

回答

5

如果你的鏈表沒有循環,那麼這是一個「鏈表」的事實是一個內存細節,而不是一個序列化的細節。只需將節點值寫入文件中,並在反序列化時構建next指針。

但是,如果你的鏈接列表確實有有循環,那麼你需要更聰明的東西。您需要將next指針作爲文件存儲到節點(或類似的東西)來對「鏈接」進行編碼。

對於鏈表中的每個節點,存儲兩個單詞。第一個是數據,第二個是next節點的偏移量。這裏是一個循環鏈表的例子:

+-> 1234 -> 5678 -> 2398 -+ 
|       | 
+-------------------------+ 


0 : 4bytes: 1234 : int data <------------+ 
4 : 4bytes: 8 : offset of next node -+ | 
             | | 
8 : 4bytes: 5678 : int data <----------+ | 
12 : 4bytes: 16 : offset of next node -+ | 
             | | 
16 : 4bytes: 2398 : int data <----------+ | 
20 : 4bytes: 0 : offset of next node ---+ 
+3

@mousey:您可以在序列化之前對它們進行排序。通常,您不希望序列化例程修改數據。換句話說,你需要'A ==反序列化(序列化(A))'。如果你開始改變元素的順序,那你就麻煩了。 – Stephen 2010-06-22 03:36:21

+0

@Stephen如果我添加一個新元素需要按排序順序。我是否需要反序列化整個列表以添加新元素? – mousey 2010-06-22 03:42:12

+1

@mousey:可能。但是,通常,每次將元素添加到列表時,都不會序列化(和反序列化)。您通常將其序列化以通過網絡發送,將其存儲在磁盤上等。如果排序屬性(和常量重新編碼)非常重要,那麼您可以選擇其他格式 - 寫入時,總是附加到文件的後面並在閱讀時保持排序。 – Stephen 2010-06-22 03:53:36