I’ve frequently used a linear linked list construct in C
typedef struct _node {
...node guts...
struct _node *next
} node;
And the enumeration idiom
for (node *each = headNode; each != NULL; each = each->next)
I’m in a situation right now, where a circular list is attractive to me (e.g. the next of the last node is set to the headNode). Naively, I thought I’d using something similar to the for expression there, and the more I’ve stared at it, I think I’ve convinced myself you can’t do something like that with a circular linked list.
It seems that no matter what kind of expression I come up with for the end conditional, I’ll have the basic problem that I want said conditional to evaluate true the first time and false the second time the same node is encountered. I could do something with a loop side effect:
for (BOOL traversed = FALSE, node *each = headNode;
traversed && each != headNode;
traversed = TRUE, each = each->next)
But that definitely loses the elegance/simplicity of the null terminated list approach. Is there some trick of logic that’s eluding me this late in the day?
Obviously I can use a while() construct, and maybe that’s the only way to do it.
Assuming the following:
nextpointer references your starting point, including a single-node list who’snextpointer self-references.nextpointers are NULL.Then the following will do what you want using a tertiary expression as the incremental step.
Note:
pwill be NULL when this exits, one way or another;startwill remain unchanged, and a NULLstartis acceptable, as is a single-self-referencing node.That said, I’d do this with a while-loop, but since you specifically asked for a for-loop you gets that =P.