首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言數組循環邏輯解析:约瑟夫環變體與指針跳轉

     編輯:程式設計綜合問答

代碼核心邏輯

int p[17] = {0};
for (int i = 0; i < 16; i++) p[i] = i + 1; // p[0..15] = 1..16, p[16]=0
int head = 0, test;
while (1) {
    test = p[head];        // 記錄下一個節點值
    p[head] = p[test];     // 刪除 test 節點:head 指向 test 的下一個
    head = test;           // 移動 head 到被刪除節點位置
    if (head == 0) break;  // 回到起點結束
}

執行流程圖解

初始鏈表:0→1→2→...→16→0(索引為節點,值為 next 指針)

  1. head=0,test=p[0]=1,p[0]=p[1]=2,刪除節點 1,head=1
  2. head=1,test=p[1]=2,p[1]=p[2]=3,刪除節點 2,head=2
  3. ... 依次刪除 3,4,...,16
  4. 最終 head=16,test=p[16]=0,p[16]=p[0]=2(此時 p[0] 已變為 2),head=0 滿足退出條件

關鍵觀察

  • p[head]=p[head] 這句確實無效(自我賦值),可能是調試殘留。
  • 此算法實際模擬**單向循環鏈表**的逐個節點刪除過程,而非經典约瑟夫環(步長固定)。
  • 數組 p 同時充當「節點值」與「next 指針」,節省結構體開銷,屬於「靜態鏈表」技巧。

學習建議

用紙筆畫出前 5 步的數組狀態變化,理解「值即指針」的映射關系;嘗試修改步長實現真正的约瑟夫問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved