私は C で線形連結リスト構成を頻繁に使用してきました。
typedef struct _node {
...node guts...
struct _node *next
} node;
そして、列挙イディオム
for (node *each = headNode; each != NULL; each = each->next)
私は現在、循環リストが魅力的な状況にあります (たとえば、最後のノードの次が headNode に設定されています)。素朴にそこの表現に似たものを使っていると思っていたのfor
ですが、見れば見るほど、循環リンクリストではそのようなことはできないと確信したようです。
終了条件にどのような式を思いついたとしても、同じノードに遭遇したときに最初に true を評価し、2 回目に false を評価するという基本的な問題があるようです。私はループの副作用で何かをすることができました:
for (BOOL traversed = FALSE, node *each = headNode;
traversed && each != headNode;
traversed = TRUE, each = each->next)
しかし、それはヌル終了リストアプローチの優雅さ/単純さを確実に失います。一日の終わりに私を逃れている論理のトリックはありますか?
明らかに、while() コンストラクトを使用できますが、おそらくそれが唯一の方法です。