约瑟夫环-----数数
#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
int data;
struct list*next;
}List;
List*insert_list(List*head,int data)
{
List*newnode=(List*)malloc(sizeof(List));
List*tail=head;
newnode->data=data;
if(head==NULL)
{
newnode->next=newnode;
return newnode;
}
while(tail->next!=head)
{
tail=tail->next;
}
tail->next=newnode;
tail=newnode;
tail->next=head;
return head;
}
void print_list(List*head)
{ List*p=head;
while(p && p->next!=head)
{
printf("%d\n",p->data);
p=p->next;
}
if(p)
{
printf("%d\n",p->data);
}
}
void count_list(List*head,int m)
{
int count=1;
List*pre;
List*cur=head;
List*tail=head;
while(tail && tail->next!=head)
{
tail=tail->next;
}
pre=tail;//确定pre和tail的值
while(cur && cur->next!=cur)
{
if(count==m)
{
pre->next=cur->next;
printf("%d\n",cur->data);
free(cur);
cur=pre->next;
count=1;
}
else
{
count++;
pre=cur;
cur=cur->next;
}
}
if(cur)
{
printf("%d\n",cur->data);
free(cur);
}
}
int main()
{ int i,m,n;
List*head=NULL;
printf("please input m:\n");
scanf("%d",&m);
printf("please input n:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
head=insert_list(head,i);
}
print_list(head);
printf("count:\n");
count_list(head,m);
}