#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int elemtype;
typedef struct Lnode
{
elemtype data;
struct Lnode* next;
}linknode;
void cirlink_tailinsert(linknode*& link, int cirlink_length) //尾插法建立一个不带头结点的循环单链表
{
link = (linknode*)malloc(sizeof(linknode));
linknode* temp, * tail = link;
link->data = 1;
for (int i = 1; i < cirlink_length; i++)
{
temp = (linknode*)malloc(sizeof(linknode));
temp->data = i + 1;
tail->next = temp;
tail = temp;
}
tail->next = link;
}
void cirlink_display(linknode* link)//打印输出
{
linknode* temp = link;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != link);
}
void josephring(linknode*& link, int cirlink_length, int cirlink_del_number)
{
linknode* p = link;
linknode* pre = link;
int count = 0;
while (p->next != p)
{
for (int i = 0; i < cirlink_del_number - 1; i++)
{
pre = p;
p = p->next;
}
count++;
printf("第%d次输出的编号:%d\n", count, p->data);
pre->next = p->next;
free(p);
p = pre->next;
}
printf("第%d次输出的编号:%d\n", cirlink_length, p->data);
free(p);
}
int main()
{
linknode* link;
int cirlink_length; //定义数据节点长度
int cirlink_del_number;//定义删除条件
printf("请输入数据个数,建立循环单链表,循环单链表如下\n");
scanf_s("%d", &cirlink_length);
cirlink_tailinsert(link, cirlink_length);
cirlink_display(link);
printf("\n");
printf("\n");
printf("请输入出列数字\n");
scanf_s("%d", &cirlink_del_number);
printf("以下为结果\n");
josephring(link, cirlink_length, cirlink_del_number);
return 0;
}