#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}LINKLIST;
LINKLIST *initList(int n){
// 创建一个循环链表 ,赋予的值分别为1,2,3,4....
LINKLIST *head = (LINKLIST*)malloc(sizeof(LINKLIST));
LINKLIST *p = head;
head->next = NULL;
head->data = 1;
int i;
for(i = 2;i<n+1;i++){
// 创建其余节点
LINKLIST *people = (LINKLIST*)malloc(sizeof(LINKLIST));
people->data = i;
people->next = NULL;
p->next = people;
p = p->next;
}
// 出循环,尾部指向头
p->next = head;
return head;
}
LINKLIST *josepho(int n,int m,int k)
{
// n代表输入的人数,m代表数到m出圈,k代表重序号k开始数
LINKLIST *peopleList = initList(n);
LINKLIST *p = peopleList,*q,*front;
int i = 0;
for(i;i<k-1;i++){
p = p->next;
}
int man = 0;
for(i = 0;i<n;i++){
// 总共最多需要n次循环退出
int j = 1;
if(m>=3){
for(j;j<=m-1;j++){
p = p->next;
if(j==m-2)
front = p;//记录前一次指针
}
}else{
if(m<=0)
{
printf("请输入有效的数字!");
return;
}else if(m==2){
front = p;//记录前一次指针
p = p->next;
}else{
front = p;
}
}
// 循环结束
man = p->data;//记录被淘汰的人
q = p;//记录要释放的位置
front->next = p->next;
p = p->next;//淘汰p位置的人
free(q);
printf("被淘汰的人:%d\n",man);
}
}
int main()
{
josepho(5,2,3);
}
``
c语言循环链表实现约瑟夫环
最新推荐文章于 2024-09-18 23:37:18 发布