2010-06-22 143 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