约瑟夫环问题介绍:
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...,n分别表示)围坐在一张圆周周围。从编号为k的人开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
算法原理:
循环链表:
循环链表是一种链式存储结构,它的特点是链表中最后一个结点的指针指向头结点,整个链表形成一个环。
约瑟夫环主要涉及到循环链表的创建和结点的删除
循环链表的创建代码实现:
typedef struct Node //构建结构体
{
int data; //数据部分
struct Node *next; //指针部分
}LinkList;
LinkList *create(int n) //链表的建立
{
LinkList *p,*q,*head;
int i=1;
p=(LinkList*)malloc(sizeof(LinkList)); //建立第一个结点
p->data=i;
head=p;
for(i=1;i<n;i++) //建立n-1个结点
{
q=(LinkList*)malloc(sizeof(LinkList));
q->data=i+1;
p->next=q;
p=q;
}
p->next=head; //使链表尾连接链表头,形成循环链表
return head;
free(p);
p=NULL;
free(q);
q=NULL;
}
结点的删除的代码实现:
void deletefun(LinkList *L,int m)
{
LinkList *curr,*prev,*temp;
curr=L;
while(curr->next!=curr)
{
int n=m-1;
while(n--) //删除结点的定位
{
prev=curr; //关键:定义当前的结点的前一结点
curr=curr->next;
}
printf("%d ",curr->data); //输出结点的数据部分
temp=curr; //删除结点
prev->next=curr->next;
curr=curr->next;
free(temp);
}
printf("%d ",curr->data);
}