循环链表的应用

所谓的循环链表就是在单链表的基础上,将尾结点的指针指向第一个结点,实现链表的可循环处理。

约瑟夫环就是循环链表的一个实践,内容:假设有N个人站成一圈,每个人手里都有一个随机密码,开始有一个初始密码M,第一个人按顺时针从1开始报数,直到M值,该人即出列。然后取出该人的密码当做M值,从他的下一位开始报数,一直重复,直到所有人出列完毕。

#include 
#include

typedef struct List{
    int code;
    int num;
    struct List *next;
}list;

list *create(int n);
void fun(list *tial,int n,int m);

int main(){
    int n,i,m;
    list *tial;
    scanf("%d",&n);
    scanf("%d",&m);
    tial=create(n);

    fun(tial,n,m);



}

list *create(int n){
    list *head,*pnew,*pend;
    int i;
    for(i=1;i<=n;i++){
        pnew=(list*)malloc(sizeof(list));
        pnew->num=i;
        scanf("%d",&pnew->code);
        if(i==1){
            head=pend=pnew;
            pnew->next=head;
        }else{
            pend->next=pnew;
            pnew->next=head;
            pend=pnew;
        }
    }
    return pend;
}

void fun(list *tail,int n,int m){
    list *p=tail,*temp,*pend=tail;
    int count=m%n,i;
    while(p->next!=p){
        if(count==0){
            count=n;
        }
        for(i=1;i<=count;i++){
            pend=p;
            p=p->next;
        }
        printf("%d ",p->num);
		
        count=p->code%n;
        if(p->code>n){
        	count=count+p->code/n;
		}
        temp=p;
        pend->next=p->next;
        free(temp);
        p=pend;

    }
    printf("%d",p->num);
}

你可能感兴趣的:(c语言专题)