Сериализация данных в порядке их хранения в связанном списке в стиле записи в файл.fwrite
особенно хорош для этого.Обязательно разыменовывайте указатели и помните, какую роль в этом играет порядок байтов.
Вот некоторый расплывчатый псевдокод:
List *list_new();
List *list_add(List *, void *data);
List *list_next(List *);
while (node) {
fwrite(node->data, sizeof(node->data), 1, fp);
node = list_next(node);
}
Грубый код для считывания в живой список:
List *node = list_new();
while (true) {
struct data *buf = malloc(sizeof(*buf));
if (1 != fread(buf, sizeof(*buf), 1, fp))
break;
list_add(node, buf);
}
Update0
Если вы начнете вкладывать более сложные структуры, такие как другие связанные списки, строки переменной длины и т. Д., Вам потребуется предоставить типы и длины для каждой записи, а также способВложите записи в другие записи.
Например, если в вашем связанном списке верхнего уровня есть элемент данных, который был другим списком, лучше всего сохранить этот элемент как вложенную запись, дополненную длиной,и введите поле.В качестве альтернативы вы можете определить записи часового типа, такие как \0
для символьных строк (очевидный выбор) и обнуленные блоки для структурных данных.