稽20疯会 发表于 2019-12-11 20:46:35

约瑟夫问题代码简化

void main(){
        CLinkList *list,*head,*temp;
        list=(CLinkList*)malloc(sizeof(CNode));
        head=list;//暂存头节点
        list->data=0;
        list->next=head;
        for(int i=1;i<=41;i++){
                CLinkListAdd_wei(list,i);//尾插法初始化循环链表
        }
        for(int i=1;i<=41;i++){
                list=list->next;
        }//list后移到最后一个节点
        temp=list;//temp指向尾节点(即头结点前一节点)
        list=head;//list重新指向头结点
        int i=1;
        while(list->next!=list){
                if(list->data==0){//删除头结点和已经自杀的节点
                        temp->next=list->next;//工作指针后移
                        list=list->next;
                        //懒得free了
                        continue;
                }else if(i%3==0){
                        printf("%d ",list->data);//输出自杀的人
                        list->data=0;
                }
                temp=list;//重新指向list前一节点
                list=list->next;//工作指针后移
                i++;//计数器
        }
        printf("%d",list->data);//输出最后一个,因为只剩最后一个节点时已跳出循环
}
后期可以通过宏定义实现任意人数和间隔的问题。
页: [1]
查看完整版本: 约瑟夫问题代码简化