1. 程式人生 > >C/C++,資料結構單鏈表實現約瑟夫環

C/C++,資料結構單鏈表實現約瑟夫環

約瑟夫環——圍成一圈,定義一個數值K,從任意位置開始計數,每走K步刪除當前位置結點,直到剩下最後一個結點,求最後一個結點

//單鏈表結構以及Find函式參見 2016-1-2 13:56 發表部落格

SListNode* Joseph(SListNode *&pos, int K) //約瑟夫環
{
 assert(pos);
 if (K > 0)
 {
  SListNode *tmp = pos;
  while (1)
  {
   int count = K;
   while (--count)
   {
    tmp = tmp->next;
   }
   if (tmp->next == tmp)
    return tmp;
   SListNode *cur = tmp->next;//刪除tmp位置的結點,思路:pos與下一位置結點元素值進行交換後,刪除下一結點
   DataType Tmpcount = cur->data;
   tmp->next = cur->next;
   cur->data = tmp->data;
   tmp->data = Tmpcount;
   free(cur);
  }
 }
 return NULL;
}

void Test7()// Joseph
{
 printf("//Test7() Joseph \n");
 SListNode *LL = NULL;
 PushBack(LL, 1);
 PushBack(LL, 2);
 PushBack(LL, 3);
 PushBack(LL, 4);
 PushBack(LL, 5);
 PushBack(LL, 6);
 PushBack(LL, 7);
 Find(LL, 7)->next = Find(LL, 1);
 printf("%d\n", Joseph(LL, 3)->data);
}

wKiom1aKmSnw3ZgMAAAc7oG2MHo188.png