1.实验目的
(1)熟悉上机环境,掌握上机操作方法和步骤;
(2)掌握线性表的特点、逻辑结构和物理实现;
(3)掌握单向链表的建立、插入、删除等基本操作的实现;
(4)掌握循环链表的建立、插入、删除等基本操作的实现。
- 实验内容
用循环链表求解约瑟夫问题。。
约瑟夫问题:n 个人围成一个圆圈,首先第1个人开始,一个人一个人顺时针报数, 报到第m个人,令其出列;然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,…,如此下去, 直到圆圈中只剩一个人时,此人即为优胜者。
例如:n=8,m=3
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Lnode,*LinkList;
void circle(int n, int m)
{
LinkList p = NULL, x = NULL, list = NULL;
int i;
for( i = 1;i <= n;i++)
{
p = (Lnode*)malloc(sizeof(Lnode));
if(p == NULL)
exit(1);
p -> data = i;
if(list == NULL)
list = p;
else
x -> next = p;
x = p;
}
p -> next = list;
p = list;
while(p -> next != p)
{
for(i = 1;i < m;i++)
{
x = p;
p = p->next;
}
x -> next = p -> next;
free(p);
p = x -> next;
}
printf("%d",p -> data);
free(p);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
circle(n,m);
system("pause");
}