#include
#include
typedef struct node
{
int data;
struct node* next;//指针域
int size;//循环链表的长度
} node,*linklist; //linklist为定义的指针结构体变量,
void create_list_tail( node* l)//尾插法建立循环链表
{
int a[100];
int i, j, x;
struct node* p, r, t;
j = 50;
(*l) = (node*)malloc(sizeof(node));
(*l)->next = NULL;
(*l)->size = j;
t = (*l);
x = 1;
for (i = 0; i < j; i++)
{
p = (node*)malloc(sizeof(node));
p->data = x;
t->next = p;
t = p;//每新建一个结点在结束时都为最后一个结点,下一个节点在这个结点后面插入
x++;
}
t->next = NULL;
r = (*l)->next;
while (r->next != NULL)
{
r = r->next;
}
r->next = (*l)->next;
}
void realise(linklist* l)//约瑟夫环的实现并打印输出
{
int i, j, k, x;
int a[50];
linklist p, r, t;
p = (*l)->next;
k = (*l)->size;
for (i = 0; i < k; i++)
{
for (j = 0; j < 7; j++)
{
p = p->next;
}
a[i] = p->next->data;
t = p->next;
p->next = t->next;//每次找到这个free(t);
p = p->next;//从下一个节点重新开始循环
}
for (i = 0; i < 50; i++)
{
printf("%d ", a[i]);
if (i % 10 == 0)
{
printf("\n");
}
}
}
int main()
{
linklist b;
create_list_tail(&b);
realise(&b);
return 0;
}