约瑟夫环(约瑟夫问题)
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
解法1
/*此算法将头指针head也进行data赋值*/
#include<stdio.h>
typedef struct node //定义结构体
{
int data;
struct node *next;
} linknode,*link;
int main()
{
void josephu(link head,int n,int k,int m);
int n,k,m;
link head;
printf("请输入元素个数,开始计数元素的编号,循环的个数:");
scanf("%d %d %d",&n,&k,&m);
josephu(head,n,k,m);
return 0;
}
void josephu(link head,int n,int k,int m) //此算法将头指针head赋予data值,以便于循环链表结点的删除.
{
link p,r;
int i;
head=NULL;
for(i=1; i<=n; i++) //创建链表
{
p=(link)malloc(sizeof(linknode));
p->data=i;
if(head==NULL)
head=p;
else
r->next=p;
r=p;
}
p->next=NULL; //创建一个单向链表
link x=head; //打印单向链表
printf("队列顺序:");
while(x)
{
printf("%d ",x->data);
x=x->next;
}
printf("\n");
p->next=head; //将单向链表转化为循环链表
p=head;
for(i=1; i<k; i++) //使p指向开始计数的结点
{
r=p;
p=p->next;
}
printf("出队顺序:");
while(p->next!=p)
{
for(i=1; i<m; i++) //使p指向需要删除的结点
{
r=p;
p=p->next;
}
printf("%d ",p->data); //打印出队顺序
r->next=p->next;
free(p);
p=r->next;
}
printf("%d\n",p->data); //打印最后一个结点的数据
free(p);
}
解法2
/*此算法没有将头指针head进行data赋值*/
#include<stdio.h>
typedef struct node //定义结构体
{
int data;
struct node *next;
} linknode,*link;
int main()
{
void josephu(link head,int n,int k,int m);
int n,k,m;
link head;
head=(link)malloc(sizeof(linknode));
head->next=NULL;
printf("请输入元素个数,开始计数元素的编号,循环的个数:");
scanf("%d %d %d",&n,&k,&m);
josephu(head,n,k,m);
return 0;
}
void josephu(link head,int n,int k,int m) //此算法头指针head没有进行赋data值;
{
link p,r;
int i;
r=head;
for(i=1; i<=n; i++) //创建链表
{
p=(link)malloc(sizeof(linknode));
p->data=i;
r->next=p;
r=p;
}
r->next=NULL; //创建一个单向链表
link x=head->next; //打印单向链表
printf("队列顺序:");
while(x)
{
printf("%d ",x->data);
x=x->next;
}
printf("\n");
r->next=head->next; //将单向链表转化为循环链表
link q;
p=head->next;
for(i=1; i<k; i++) //使p指向开始计数的结点
{
q=p;
p=p->next;
}
printf("出队顺序:");
while(p->next!=p)
{
for(i=1; i<m; i++) //使p指向需要删除的结点
{
q=p;
p=p->next;
}
printf("%d ",p->data); //打印出队顺序
q->next=p->next;
free(p);
p=q->next;
}
printf("%d\n",p->data); //打印最后一个结点的数据
free(p);
}