约瑟夫环问题 数据结构 c语言
2009-06-02 22:37
357 查看
一:约瑟夫环问题(第二章)
约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向坐一圈,没人持有一个密码(正整数)。一开始任选一个作为报数上限值m,从第一个开始顺时针自1开始顺序报数,报到m是停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人重新从1报数,如此下去,直到所有的人全部出列为止。设计一个程序,求出出列顺序。
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编码。
例如m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,8,4出列的顺序是6,1,4,7,2,3,5。
1、程序代码
#include<stdio.h>
typedef struct data
{
int num;
int val;
}typdata;
typedef struct node
{
typdata data;
struct node*next;
}listnode;
typedef listnode*linklist;
linklist head;
void main()
{
int n,i,b,m,j;
linklist head=(listnode*)malloc(sizeof(listnode));
listnode *p,*q;
printf("please input the totle number:");
scanf("%d",&n);
q=head;
for(j=1;j<=n;j++)
{
printf("please input the node of No.%d student:/n",j);
scanf("%d",&b);
printf("%n");
q->next=(listnode*)malloc(sizeof(listnode));
q=q->next;
q->data.val=b;
q->data.num=j;
q->next=head->next;}
printf("please input a number:/n");
scanf("%d",&m);
if(m<=0)
printf("ERROR!/n");
else
{
printf("The answer is:/n");
do
{
i=1;
while(i!=m)
{
q=q->next;
i++;
}
p=q->next;
q->next=p->next;
printf("num:%d/tval:%d/n",p->data.num,p->data.val);
free(p);
}
while(q->next!=q);
printf("num:%d/tval:%d/n",q->data.num,q->data.val);
free(q);
free(head);
}
}
约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向坐一圈,没人持有一个密码(正整数)。一开始任选一个作为报数上限值m,从第一个开始顺时针自1开始顺序报数,报到m是停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人重新从1报数,如此下去,直到所有的人全部出列为止。设计一个程序,求出出列顺序。
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编码。
例如m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,8,4出列的顺序是6,1,4,7,2,3,5。
1、程序代码
#include<stdio.h>
typedef struct data
{
int num;
int val;
}typdata;
typedef struct node
{
typdata data;
struct node*next;
}listnode;
typedef listnode*linklist;
linklist head;
void main()
{
int n,i,b,m,j;
linklist head=(listnode*)malloc(sizeof(listnode));
listnode *p,*q;
printf("please input the totle number:");
scanf("%d",&n);
q=head;
for(j=1;j<=n;j++)
{
printf("please input the node of No.%d student:/n",j);
scanf("%d",&b);
printf("%n");
q->next=(listnode*)malloc(sizeof(listnode));
q=q->next;
q->data.val=b;
q->data.num=j;
q->next=head->next;}
printf("please input a number:/n");
scanf("%d",&m);
if(m<=0)
printf("ERROR!/n");
else
{
printf("The answer is:/n");
do
{
i=1;
while(i!=m)
{
q=q->next;
i++;
}
p=q->next;
q->next=p->next;
printf("num:%d/tval:%d/n",p->data.num,p->data.val);
free(p);
}
while(q->next!=q);
printf("num:%d/tval:%d/n",q->data.num,q->data.val);
free(q);
free(head);
}
}
相关文章推荐
- 约瑟夫循环c语言实现 (<<数据结构与算法>>-王曙燕 约瑟夫环问题解答)
- 数据结构之线性表——约瑟夫环问题(循环链表的应用)
- 数据结构 C语言 约瑟夫问题
- 数据结构 循环链表的应用:约瑟夫环问题
- C语言基于循环链表解决约瑟夫环问题的方法示例
- 数据结构 C语言 队列 迷宫问题
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 【C语言】 约瑟夫环问题
- C语言指针实现循环报数问题(简单约瑟夫环问题)
- 跪求一道关于c语言和数据结构的问题
- 【c语言】使用数组解决 约瑟夫环问题
- (线性数据结构5.4.1)UVA 130 Roman Roulette(标准约瑟夫环问题+替换者)
- C语言-数据结构-骑士周游-马踏棋盘问题-源代码
- 用线性表来解决约瑟夫环问题(C语言)
- C语言实现约瑟夫环问题
- 数据结构 括号匹配问题 (栈 C语言)
- 数据结构-C语言括号匹配问题(栈和计数方式两种思想)
- C语言,数组实现约瑟夫环问题(两种方法)
- 数据结构:循环链表求解约瑟夫环问题
- 数据结构 c语言 循环队列实现扑克牌问题