質問: リンクされたリストの破損したポインタを解決するには? リンクされたリストのポインタ(リンク)フィールドが壊れていることがわかったら、どうすればこの問題を解決できますか? 私はインタビューでこの質問をしました。私はいいえ、それを解決することはできません。インタビュアーはその可能性を語った。どんな方法がありますか?
回答: 二重循環リンクリストでは、ポインタ(前または次のポインタ)のいずれかが破損している場合、破損したポインタを解決できます。 次のポインタが適切でない場合、逆順にリストをたどり、それを修正することができます。あるいは、前のポインタが適切でない場合、リストを前方にたどって修正することができます。 今度は、リスト内の破損したリンク(ポインタ)を特定する方法を考える必要があります。各ノードごとに動的メモリ( `malloc` または `calloc` )を個別に割り当てるために使用します。小さなメモリで頻繁に `malloc` または `calloc` を呼び出すと、システムのパフォーマンスに影響を与える可能性があります。むしろ、この段階ではヒープメモリの大きなジャンクを初期段階に割り当ててから、各ノードの作成ごとに独自のメモリ割り当て機能を実装することができます。また、これをリストノードの作成にのみ使用して、リストの破損リンクを識別します。 これにより、システムのパフォーマンスが向上し、リストに割り当てられた最初のメモリの制限を調べることで、ノードのリンクが破損しているかどうかを確認するのに役立ちます。 ノードへのポインタを取得したら、まずそのノード内のデータにアクセスする前に、以下のチェックを行う必要があります。 ``` check_limit(node); check_limit(node->next); check_limit(node->previous); ``` And also we can check whether the `node->previous` is equal to `current_node`. After this also there may be possibility of `node->next` might be pointing to wrong address but inside the initial memory limit. In this case we can read `node->next->previous` (this will not leads to crash, even if `next` is pointing wrong address but inside the initial memory limit) and check whether it is equal to `node` or not. また、未使用の初期メモリ空間は、 `memset` を使用して常に `NULL` に設定する必要があります。 このようにして、リスト内の破損したポインタの99%を見つけることができます。