循环链表的应用——约瑟夫环
题目:
报数,共n个人 从1编号,依次报号,报到m出队,再接着从下一个人開始数,依次输出出队的人。
#include<stdio.h>
#include<stdlib.h>
typedef struct n
{
int data;
struct n* next;
}node;
node* creat(int n)//创建n个节点的链表
{
int i=0;
node* q = NULL;
node* p = (node*)malloc(sizeof(node));
p->data = 1;//1是编号
node* head = p;
/////////////////////////////////
for(i=1;i<n;i++)
{
q = (node*)malloc(sizeof(node));//q是当前最后一个节点
q->data = i+1;
p->next = q;//p是q的前一个节点
p=q;
}
p->next = head;
return head;
}
////删除报号为m的//////////////////
void delte(int m,node* head)
{
int i;
node* p;
node* q;
node* temp;
p = head;
while(p->next!=p)
{
for(i=1;i<m;i++)
{
q=p;
p = p->next;
}
//删除节点
printf("%d ",p->data);
temp = p;
q->next = p->next;
p = p->next;
free(temp);//中间变量temp就是用来释放空间的
}
printf("%d\n",p->data);
}
int main()
{
int n,m;
node* l;
scanf("%d%d",&n,&m);
l = creat(n);
delte(m,l);
}