2013-10-25 15 views
6

Tôi quan tâm đến việc lặp trong danh sách theo cách mà tôi có thể bắt đầu ở bất kỳ vị trí nào và lặp qua toàn bộ danh sách bằng cách đi đến cuối và sau đó lặp lại đầu và lặp lại đến vị trí bắt đầu."Thông tư" cho vòng lặp trong C

Hãy để chúng tôi nói rằng tôi muốn làm điều này cho một mảng mà được đảm bảo 4 yếu tố: char array [4] = { 'a', 'b', 'c', 'd'}

tôi đang gặp khó khăn trong việc xây dựng một vòng lặp for như vậy mà tôi có thể bắt đầu tại 'a', và lặp abcd, hoặc bắt đầu tại 'b', và loop bcda, hoặc bắt đầu tại d, và vòng lặp dabc, v.v.

Tôi nghĩ phần ban đầu của vòng lặp for sẽ giống như i = startingPosition.

Tôi nghĩ rằng phần gia tăng của vòng lặp sẽ giống như i = (i + 1)% 4. Bằng cách đó, bắt đầu từ chỉ mục 2, ví dụ, sẽ tăng lên 3, sau đó 0, sau đó 1, v.v.

Điều kiện giữa, điều kiện "chấm dứt" là gì?

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

Cảm ơn!

+0

Giống như một cái đuôi đầu cho một bộ đệm tròn? *** [xem tại đây] (http://stackoverflow.com/questions/3882343/suggestions-for-concise-index-handling-in-circular-buffer) *** – ryyker

Trả lời

15

Sử dụng lặp đi lặp lại bình thường đối với sự kiểm soát vòng lặp, sau đó điều chỉnh các chỉ số modulo kích thước:

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

Đẹp! Nó rất hấp dẫn để tìm ra một cái gì đó "thông minh" nhưng điều này bàn tay tách ra hai vấn đề ở bàn tay. –

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