问题:
100人围成一个圈,每人有一个编码,编码从1到100。他们开始从1开始依次报数,报到M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人小于M。输出剩下的人原先的号码,M=3时为:58,91,M=4时为34,45,97.
分析:建立一个循环链表,删除报到数的人。其中删除子函数是将报数前一个人的指针作为形参。
程序:
#include<iostream>
using namespace std;
typedef struct node* prtonext;
typedef prtonext position;
typedef prtonext list;
struct node {
int element;
prtonext next;
};
void erase(position p)
{
position tmp;
tmp = p->next;
p->next = p->next->next;
free(tmp);
}
void list_way()
{
list head = NULL;;
list p1, p2;
int m;
m = 4;
head = (struct node*)malloc(sizeof(struct node));
head->element = 1;
head->next = NULL;
p2 = head;
for (int i = 0; i < 99; i++)
{
p1 = (struct node*)malloc(sizeof(struct node));
p1->element = i + 2;
p2->next = p1;
p2 = p2->next;
}
p2->next = head;
p1 = head;
int j = m;
while (j - 2)
{
p1 = p1->next;
j--;
}
erase(p1);
for (int i = 0; i < 100 - m; i++)
{
j = m;
while (j - 1)
{
p1 = p1->next;
j--;
}
erase(p1);
}
for (int i = 0; i < m - 1; i++)
{
cout << p1->element;
p1 = p1->next;
}
}
int main()
{
list_way();
while (1);
}