第四次博客:循环单链表解决约瑟夫环问题

#include <stdio.h>
#include <stdlib.h>
typedef struct aa{
 int data;
 struct aa *next;
}Link;
int n;
Link * CreateLink(Link *L){
 Link *p,*q;
 int i;
 printf("请输入人数:");
 scanf("%d",&n);
for(i=1;i<=n;i++){
    if(i==1){
     L=p=(Link *)malloc(sizeof(Link));
     L->data=i;
 }
 else
 {
  q=(Link *)malloc(sizeof(Link));
  q->data=i;
  p->next=q;
  p=q;
  }
 }
 p->next=L;
 return L;
}
int DeleteLink(Link *L){
 int x;
 Link *p,*q;
 int k=1,i=1;
 printf("请输入要报的数:");
 scanf("%d",&x);
 q=L;
    while(n>1){
     k++;
     p=q;
   q=q->next;
   if(k==x){
 p->next=q->next;
 printf("第%d次报数,淘汰的数:%d\n",i,q->data);
    free(q);
    k=1;
    q=p->next;
    n--;
     i++;
   }
 }
 return p->data; 
}
int main(){
 Link *L,*p;
 int x;
 L=CreateLink(L);
 for(p=L,x=0;p!=NULL,x<n;x++,p=p->next)
  printf("%d ",p->data);
 x=DeleteLink(L);
 printf("最后留下的数是%d",x);
}

posted @ 2019-04-18 21:51  罗剑雄  阅读(388)  评论(0)    收藏  举报