作业帮 > 综合 > 作业

约瑟夫环问题,急!题目要求-所用的单循环链表中不需要“头结点”,我不会,请教各位高手!约瑟夫环问题 [问题描述]编号是1

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/08/07 14:10:55
约瑟夫环问题,急!
题目要求-所用的单循环链表中不需要“头结点”,我不会,请教各位高手!
约瑟夫环问题
[问题描述]
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止.设计一个程序来求出出列顺序.
[基本要求]1.利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号.此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限.
2.向上述程序中添加在顺序结构上实现的部分.
[测试数据] m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=则正确的输出是什么?
要求:
输入数据:首先输入待处理人员数及他们的密码,然后输入m的初值,建立单循环链表.
输出形式:建立一个输出函数,将正确的出列序列输出.
编程语言是C++.
约瑟夫环问题,急!题目要求-所用的单循环链表中不需要“头结点”,我不会,请教各位高手!约瑟夫环问题 [问题描述]编号是1
这个是我写滴带头节点滴
C语言的,给你参考参考
/*计算机071 冯**编写的约瑟夫环
单项循环链表实现 原创程序
在结构体中定义了一个序号,使得空间变大,但是程序简单易懂
*/
#include
#include
struct node
{
int num;//为方便表达,每个节点拥有一个序号
int password;//密码
struct node *next;
};
node * creatlist(int people)//构造链表
{
int i=1;//序号
int _password;
node *r,*s;
node *L=(node *)malloc(sizeof(node));//创造头结点
r=L;
while(inum=i;
s->password=_password;
r->next=s;
r=s;
i++;
}
r->next=L;//循环链表
return L;
}
void getoutseq(node *L,int firstp)//计算出列顺序并输出的函数
{
int _password=firstp;
node *p=L;
node *r=L;//r为p的前驱节点
int i=1;
while(L->next!=L)//当L为非空表时一直循环,空表表示所有人已经出列,则退出循环
{
while (inext!=L)//当p的下一个节点非头结点,直接向下移
{
r=p;//p移动前先备份
p=p->next;
}
else//当p的下一个节点是头节点,则令p指向一号节点
{
r=L;
p=L->next;
}
i++;
}
printf("%d号出列\n",p->num);
_password=p->password;//获取节点中的密码
r->next=p->next;//删除并释放p
free(p);
i=1;
p=r;
}
printf("结束!\n");
}
/*
void print(node *L)//该函数用于打印每个节点的信息,方便测试
{
node *p=L->next;
while(p!=L)
{
printf("序号%d密码%d\n",p->num,p->password);
p=p->next;
}
}
*/
int main()
{
node *list;
int people;
int firstp;
printf("请输入人数:");
scanf("%d",&people);
putchar('\n');
printf("请输入初始密码:");
scanf("%d",&firstp);
putchar('\n');
list=creatlist(people);
/* print(list); //该语句用于测试
*/
getoutseq(list,firstp);
printf("按确定键退出.");
getchar();
getchar();
return 0;