Middle
Hogyan valósítanád meg egy kétszárnyú lista sorosítását?
sobes.tech MI
Válasz az MI-től
Vannak különböző megközelítések:
-
Egyszerű szerializáció (ciklusmentes listákhoz):
- Iteráljon a listán, írja ki a csomópont adatait: érték, majd a következő csomópontra mutató pointer.
- Kezelje a
nullptr-t az utolsó csomópont következő pointeréhez. - Tárolja a csomópont pointereket a deszerializáció során a visszacsatolások rekonstruálásához.
// Csomópont struktúra példája struct Node { int value; Node* prev; Node* next; }; // Egyszerű szerializáció void serialize(Node* head, std::ostream& os) { std::unordered_map<Node*, size_t> node_to_id; size_t id_counter = 0; Node* current = head; while (current) { node_to_id[current] = id_counter++; current = current->next; } os << id_counter << std::endl; // Csúcsok száma current = head; while (current) { os << current->value << " "; os << (current->prev ? node_to_id[current->prev] : -1) << " "; // Előző ID os << (current->next ? node_to_id[current->next] : -1) << std::endl; // Következő ID current = current->next; } }// Egyszerű deszerializáció Node* deserialize(std::istream& is) { size_t num_nodes; is >> num_nodes; std::vector<Node*> nodes(num_nodes); std::vector<std::pair<int, std::pair<int, int>>> node_data(num_nodes); for (size_t i = 0; i < num_nodes; ++i) { nodes[i] = new Node{}; is >> node_data[i].first >> node_data[i].second.first >> node_data[i].second.second; nodes[i]->value = node_data[i].first; } for (size_t i = 0; i < num_nodes; ++i) { int prev_id = node_data[i].second.first; int next_id = node_data[i].second.second; nodes[i]->prev = (prev_id != -1) ? nodes[prev_id] : nullptr; nodes[i]->next = (next_id != -1) ? nodes[next_id] : nullptr; } return num_nodes > 0 ? nodes[0] : nullptr; } -
Ciklusos kapcsolatok kezelése szerializálás során (pl.
std::unordered_maphasználatával a pointerek leképezéséhez):- Minden csomóponthoz egyedi azonosítót rendel a szerializálás során.
- Írja ki a csomópont adatait (érték) és a
prevésnextcsomópontok azonosítóit. - Deszerializáció során hozzon létre egy csomópont tömböt és térképezze vissza az azonosítókat a csomópont pointerekhez.
-
Szerializációs könyvtárak használata:
- Boost.Serialization
- Cereal
- Protocol Buffers (strukturált adatok)
Ezek a könyvtárak megbízhatóbb és sokoldalúbb mechanizmusokat kínálnak, beleértve összetett struktúrák és verziókezelés kezelését is.
A módszer kiválasztása a követelményektől függ: egyszerűség, teljesítmény, ciklusos kapcsolatok kezelése, használt technológiák. Kétirányú lista ciklus nélkül az ID-alapú megközelítés hatékony.