循环链表实现约瑟夫问题
1.打印序列
void PrintCList(CLinkList &L,int n){//约瑟夫问题 叫n出列
int i = L->data; //获取长度
int j = 0;
CLinkList p = L->next; //设置初始指针指向第一个元素
CLinkList t = L; //指向p的前一元素
CLinkList q = NULL;
while(i>0){
if(p->next!=L){ //p的下一结点不是头结点
j++; //j+1
if(j%n==0){ //如果是n的倍数
printf("%2d ",p->data); //输出数据
if(i>1){
printf("-->"); //输出箭头
}
i--; //长度减1
L->data--;
q = p; //删除出列元素
t->next = q->next;
}
else{ //未出 指针下移
t = t->next;
}
p = p->next; //移动p
free(q); //删除q结点
}
else{ //p下一结点为头结点
j++;
if(j%n==0){
printf("%2d ",p->data);
if(i>1){
printf("-->");
}
i--;
L->data--;
q = p;
t->next = q->next;
t = L; //当删除最后一个元素时 将t移向L
}
else{
t = t->next->next;//为删除元素时 t指向L
}
p = p->next->next; //p为第一个元素
free(q); //释放q结点
}
if(i==1){
printf("%2d ",p->data); //输出最后一个
i--;
L->data--;
L->next = L; //此时循环链表清空
free(p);
}
}
t = NULL;
}
2.主函数
int main(){
int n;
printf("输入被叫数字:");
scanf("%d",n);
CLinkList L;
InitList(L);
printf("%d\n",L->data);
PrintList(L);
cout<<endl;
PrintCList(L,n);
return 0;
}
3.循环链表基本操作
——————END——————
作者注:
记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~