2013-10-25 15 views
6

Ich bin daran interessiert, in einer Liste so zu iterieren, dass ich an jeder Position beginnen und durch die gesamte Liste iterieren kann, indem ich bis zum Ende gehe und dann zum Anfang zurückschlinge und Iterieren bis zur Startposition."Circular" für Schleife in C

Lassen Sie uns sagen, ich will das für ein Array tun, die 4 Elemente gewährleistet: char array [4] = { 'a', 'b', 'c', 'd'}

I habe Schwierigkeiten bei der Konstruktion einer for-Schleife, so dass ich bei "a" beginnen kann, und abcd Schleife, oder bei 'b' beginnen, und Schleife BCDA oder bei d beginnen, und Schleife dabc usw.

Ich denke Der Anfangsteil der for-Schleife wäre etwas wie i = startPosition.

Ich denke, der Inkrementierungsteil der for-Schleife wäre etwas wie i = (i + 1)% 4. Auf diese Weise wird beispielsweise bei Index 2 auf 3, dann 0, dann 1, usw.

Was sollte der mittlere, "beendende" Zustand sein?

for(i = startingPosition; ???; i = (i+1)%4) 

Vielen Dank!

+0

wie der Schwanz-Kopf für einen Ringpuffer? *** [siehe hier] (http://stackoverflow.com/questions/3882343/suggestions-for-concise-index-handling-in-circular-buffer) *** – ryyker

Antwort

15

Verwenden normale Iteration für die Schleifensteuerung, stellt dann den Index modulo die Größe:

for (i = 0; i < size; i++) { 
    int index = (i + startingPosition) % size; 
    // Do stuff with array[index] 
} 
+0

Nice! Es ist so verlockend, etwas "Kluges" herauszufinden, aber das trennt die beiden Probleme in der Hand. –

4
i = startingPosition; 
do 
{ 
    // use 'i' here 
    i = (i + 1) % size; 
} while (i != startingPosition);