约瑟夫问题代码简化
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]