2010-06-22 3 views
4

J'essaye d'écrire un programme pour sérialiser une liste chaînée dans un fichier sans utiliser de bibliothèque. Mon problème est comment ajouter ou enlever des noeuds à la structure sérialisée puisque je n'ai pas le prochain pointeur? Aussi, comment puis-je éviter la fragmentation?Besoin d'aide pour la sérialisation

+0

J'essaie de sérialiser une structure de liste liée. Quelqu'un peut-il m'aider à faire cela. Aucune bibliothèque externe s'il vous plaît. La sérialisation devrait fonctionner pour ajouter des nœuds et supprimer des nœuds dans les fichiers. Aussi comment convertir une struture en binaire, puis à une liste liée. (aussi il y a des "prochains" pointeurs). Aussi dans quel format dois-je le stocker afin que mon fichier puisse enregistrer plusieurs listes liées. – mousey

+0

@mousey: nous avons dépassé ce point :) Que ne comprenez-vous pas de notre discussion? – Stephen

+0

@Stephen Je n'ai pas eu le format de le stocker. Si je veux stocker une liste liée impliquant des données int. Ai-je besoin de stocker la valeur comme {int valeur et offset de fichier de la structure suivante?) Ou Comment puis-je maintenir le format de structure dans le fichier – mousey

Répondre

5

Si votre liste liée ne comporte pas de boucles, le fait qu'il s'agisse d'une "liste liée" est un détail de la mémoire et non un détail de sérialisation. Notez simplement les valeurs des noeuds dans le fichier et créez les pointeurs next lorsque vous désérialisez. Toutefois, si votre liste liée contient, alors vous aurez besoin de quelque chose de plus intelligent. Vous devrez stocker les pointeurs next en tant que décalages de fichier vers le noeud (ou quelque chose de similaire) pour encoder le "lien".

Pour chaque noeud de votre liste chaînée, stockez deux mots. Le premier est les données, le second est le décalage du nœud next. Voici une illustration de la liste liée circulairement:

+-> 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: Vous pouvez les trier avant la sérialisation. En règle générale, vous ne voulez pas que vos routines de sérialisation modifient vos données. En d'autres termes, vous voulez 'A == Deserialize (Serialize (A))'. Si vous commencez à changer l'ordre des éléments, vous avez des problèmes. – Stephen

+0

@Stephen Si j'ajoute un nouvel élément qui doit être trié. ai-je besoin de désérialiser toute la liste pour ajouter un nouvel élément? – mousey

+1

@mousey: Probablement. Mais, typiquement, vous ne sérialiser (et désérialiser) chaque fois que vous ajoutez un élément à une liste. Vous devez généralement le sérialiser pour l'envoyer sur le réseau, le stocker sur disque, etc. Vous pouvez choisir un format différent si la propriété triée (et le réencodage constant) est importante - lors de l'écriture, ajoutez toujours à l'arrière du fichier et gardez-le trié lorsque vous le relisez. – Stephen

Questions connexes