リンクされたリストの破損したポインタを解決するには?

リンクされたリストのポインタ(リンク)フィールドが壊れていることがわかったら、どうすればこの問題を解決できますか?

私はインタビューでこの質問をしました。私はいいえ、それを解決することはできません。インタビュアーはその可能性を語った。どんな方法がありますか?

2
あなたはどうやって見つけましたか?一般的には不可能です...
追加された 著者 fakedrake,
あなたはどのようにして知りました?もしあなたが知っていれば、あなたはあなたのプログラムのロジックよりも優れたロジックを持ち、より良いロジックを持っているなら、まずそれを使ってみてはいかがですか? (これは偽装されたGodelの連合です)
追加された 著者 wildplasser,
私は....宿題?
追加された 著者 wildplasser,
迷惑な一般的な面接関連のアドバイス...あなたが与えたような不満足な答えにつながる不当な仮定をしないでください。詳細については、単独リンク、二重リンク、破損していることを知る方法、解決手段、クラッシュなどを起こすことなく任意のアドレスのメモリを読み込めるかどうかなどを尋ねてください。彼らがあなたに詳細を教えてくれない場合は、これとそれがそうであればどうなるかという異なるケースを考えて、これらのケースと可能性のあることを説明してください。
追加された 著者 Alexey Frunze,
以下のリンクで、破損したポインタを調べる方法の解答を参照してください。 stackoverflow.com/questions/4079099/…
追加された 著者 vijayanand1231,
@ thrustmaster:私は私の質問のために掲示されたすべての回答を論理的に正しい答えをupvotingしています..
追加された 著者 vijayanand1231,

4 答え

まあ、それは二重にリンクされたリストだと仮定:

それが壊れた "次の"ポインタの場合、末尾で始まり、 "前の"ポインタを使用して、横断された最後の要素への参照を維持しながらリストを先頭に移動できます。悪いポインタを持つ要素を見つけたら、その要素の「次の」ポインタを、最後に移動した要素を指すようにするだけです。

二重リンクされたリストで「前の」リンクが壊れている場合、プロセスを逆にすることができます。先頭から始まり、悪い「前の」ポインタが見つかるまで移動し、最後に移動した要素への参照を使用して修正します。

4
追加された

多分あなたはそれを取り除くべきでしょうか? 実際には、リストの要素を他人が補間するだけでは一般的ではありません。

1
追加された
これはコメントとして良いかもしれない:)
追加された 著者 SuperSaiyan,

私の組み込みジョブの開発では、フォワードリンクされたキューをたくさん使用しています。私はカウントだけでなく、ヘッドポインタを保持します。キューにはcheck()メソッドがあります。このメソッドは、[count]リンクを実行し、ポインタが結果と同じでない場合は重大なエラーハンドラを呼び出します。これは絶対確実ではありませんが、ダブルプッシュやその他の一般的なキューエラーを捕捉するのに十分有効です。

注:マルチスレッドアプリケーションでは、キューを安全にチェックするためにロックする必要があります。

0
追加された

二重循環リンクリストでは、ポインタ(前または次のポインタ)のいずれかが破損している場合、破損したポインタを解決できます。

次のポインタが適切でない場合、逆順にリストをたどり、それを修正することができます。あるいは、前のポインタが適切でない場合、リストを前方にたどって修正することができます。

今度は、リスト内の破損したリンク(ポインタ)を特定する方法を考える必要があります。各ノードごとに動的メモリ( 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%を見つけることができます。

0
追加された
私はその論理を見ることができません。 two-> prev = one)を設定する必要があるかどうかを知るにはどうすればよいでしょうか?(one-> next == two && 2->コード>または[b]のいずれかが最初に間違っていましたか?伝える方法はありません。 ((two-> prev == three && three-> next == two)のように単純なケースがあります。これは最初のケースでone-> nextが間違っていたことを示しています)
追加された 著者 wildplasser,
@wildplasser:私は自分の答えを更新しました。チェックしてください。
追加された 著者 rashok,