1 到 n 个人,从第 1 个开始数,数到 k 的退出,然后旁边的重新开始数,数到 k 退出,如此循环,直到所有人都退出。
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}*linklist,listnode;
linklist create_link(int len) //建立循环链表
{
linklist p,rear,head = NULL;
while(len)
{
p = (linklist)malloc(sizeof(listnode));
p->data = len --;
p->next = head;
if(head == NULL)
rear = p;
head = p;
}
rear->next = head;
return (head);
}
void print_link(linklist head) //打印输出
{
if(head == NULL)
{
printf("元素没有,空表一个!\n");
return;
}
linklist p = head;
do
{
printf("%d ",p->data);
p = p->next;
}
while (p != head && p);
printf("\n");
}
void del_link(linklist head,int k,int length) //删除函数
{
linklist p,q,r = head;
int i,len = length;
while(head)
{
i = ((length - len) ? 0 : 1);//开始时,头指针指向为第一个,故 i = 1
while(i < k-1)
{
p = p->next;
i ++;
}
if(k == 1) //k=1时,即每隔零个删除,作为特殊情况处理
{
if(len == length) //断开循环
{
while(r->next != head)
r = r->next;
r->next = NULL;
}
head = p->next;
printf("删除%d:\t",p->data);
p = head;
}
else //k!=1时,一般处理
{
q = p->next;
p->next = q->next;
printf("删除%d:\t",q->data);
if(q == head)
head = q->next;
free(q);
}
len --;
if(!len) head = NULL;
print_link(head);
if(!len)return;
}
}
int main()
{
linklist head;
int n,k,i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
head = create_link(n);
printf("原始环为:");
print_link(head);
del_link(head,k,n);
}
system("PAUSE");
return 0;
}