13個人圍成一圈,從第1個人開始順序報號1,2,3。凡報到3者退出圈子。找出最后留在圈子中的人原來的序號。要求用鏈表實現。
點我看視頻講解+可運行代碼,記得收藏視頻,一鍵三連
解題思路:
創建一個環形鏈表,給鏈表中的每一個節點從1~13編號,然后開始淘汰過程,對於淘汰的節點,序號置為0,淘汰完成之后,找到序號不為0的即為最后留下的。
#include <stdio.h>
#define NUM 13
typedef struct people
{
int num;
struct people *next;
} people;
int main()
{
int count = NUM;
people p[NUM];
people *head;
head = p; //head 指向p[0]
//1~13編號
for (int i = 0; i < NUM; i++)
{
head->num = i + 1;
head->next = &p[i + 1];
head = head->next;
}
//最后一個元素指向第一個元素 , 形成環
p[NUM - 1].next = p;
int i = 1;
head = p;
while (count > 1)
{
//跳過已經被淘汰的節點
if (head->num == 0)
{
head = head->next;
continue;
}
if (i == 3)
{
//被淘汰的節點,num置為0
printf("第 %d 位置被淘汰\n", head->num);
head->num = 0;
count--;
}
head = head->next;
i++;
if (i > 3)
{
i = 1;
}
}
printf("--------------\n");
while (head->num == 0)
{
//非0節點即為最后留下的
head = head->next;
if (head->num != 0)
{
printf("留到最后的是 %d \n", head->num);
}
}
return 0;
}
運行截圖: