Question on tree-walking and mutually-recursive types
Andreas Schwab
schwab@suse.de
Tue Jun 29 10:17:00 GMT 2004
Michael Matz <matz@suse.de> writes:
> Hi,
>
> On Mon, 28 Jun 2004, Zack Weinberg wrote:
>
>> struct S { struct S *next; };
>>
>> bool
>> detect_cycle(struct S *list)
>> {
>> struct S *p, *q;
>> bool advance_q = false;
>>
>> if (list == 0)
>> return false;
>>
>> q = list;
>> p = list->next;
>>
>> do
>> {
>> if (q == p)
>> return true;
>>
>> if (advance_q)
>> q = q->next;
>> p = p->next;
>> advance_q = !advance_q;
>> }
>> while (p);
>> return false;
>> }
>
> ??? This tests if list_{2j+1} or list_{2j+2} equals list_j. Hence it
> doesn't detect cycles. Cf list == {1,2,3,1}
It doesn't have to detect it in the first round, but eventually the
pointers will be equal in some other round since they are running at
different speeds through the cycle.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, MaxfeldstraÃe 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
More information about the Gcc
mailing list