用单循环链表实现约瑟夫环(c语言)

news/2025/1/16 0:50:02/

首先我是设置的链表节点的元素包括三个:1.每个人的各自拥有的顺序(math表示)2.每个人所拥有的密码(data表示)3.指针元素指向下一个: 

typedef struct node {int math;  //math为人的顺序// int data;  //data为人所带的密码// struct node *next;
} node,*Linklist;

然后初始话是直接用的双重指针传入的函数体,当然返回值就是void了:

void Initlist(Linklist *L) {             //初始化// (*L)=(Linklist)malloc(sizeof(node));(*L)->next=(*L);
}

然后就是创建单循环链表,这里也是引用的双重指针(比较省事),正常的链表写法,n是人数多少:

void created(Linklist *L,int n) {        //创建单循环链表// node *s,*r;r=*L;int i;while(n--) {s=(Linklist)malloc(sizeof(node));printf("请输入元素位置和密码:");scanf("%d%d",&s->math,&s->data);r->next=s;r=s;}r->next=(*L)->next;      //让尾节点指向首元节点// 
}

下来就是最重要的链表处理环节,这里的话我是重新申请了两个节点(一个是后继节点,一个是普通节点),这里传入的是一重指针L和人数大小n,定义了m是第一个初始密码,第一个for循环就是找密码结束的哪个点的位置,后面的处理直接看图比较清晰:

​void print(Linklist L,int n) {Linklist p,r;    int m;             //第一个开始密码// p=L;               //指向头节点//r=L->next;         //后驱节点// printf("请输入第一个密码:");scanf("%d",&m);printf("出列顺序:");while (n--){for (int j = 1; j < m ; j++)    //循环m-1次后后继节点就是要删除的节点!!// {p = r;                        r = r->next;}printf("%2d", r->math);  //后驱结点法只能输出后驱节点的math// p->next = r->next;      //让后驱节点轮空// m = r->data;           //将出列的玩家的密码设为新的密码//free(r);              //释放要删除的节点// r = p->next;         //重新给r节点赋值为p的前驱// }
}​

最后附上整个代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct node {int math;  //math为人的顺序// int data;  //data为人所带的密码// struct node *next;
} node,*Linklist;
void Initlist(Linklist *L) {             //初始化// (*L)=(Linklist)malloc(sizeof(node));(*L)->next=(*L);
}
void created(Linklist *L,int n) {        //创建单循环链表// node *s,*r;r=*L;int i;while(n--) {s=(Linklist)malloc(sizeof(node));printf("请输入元素位置和密码:");scanf("%d%d",&s->math,&s->data);r->next=s;r=s;}r->next=(*L)->next;      //让尾节点指向首元节点// 
}
void print(Linklist L,int n) {Linklist p,r;int m;             //第一个开始密码// p=L;r=L->next;         //后驱节点// printf("请输入第一个密码:");scanf("%d",&m);printf("出列顺序:");while (n--){for (int j = 1; j < m ; j++)    //循环m-1次后后继节点就是要删除的节点!!// {p = r;                        r = r->next;}printf("%2d", r->math);  //后驱结点法只能输出后驱节点的math// p->next = r->next;      //让后驱节点轮空// m = r->data;           //将出列的玩家的密码设为新的密码//free(r);              //释放要删除的节点// r = p->next;         //重新给r节点赋值为p的前驱// }
}
int main() {int n;Linklist L;Initlist(&L);printf("请输入人数大小:");scanf("%d",&n);created(&L,n);print(L,n);return 0;
}

后面加一张运行结果:

这里的话是7个人,从前往后每个人携带的密码分别为:3.1.7.2.4.8.4。

第一个开始密码是:20


http://www.ppmy.cn/news/872963.html

相关文章

单循环赛贝格尔编排法实现

单循环赛&#xff0c;是指所有参赛队伍都需跟其他队伍比赛一次&#xff0c;根据比赛得分&#xff0c;胜负场次来排列名次。比赛队伍为单数时&#xff0c;轮数等于队伍数&#xff0c;为双数时&#xff0c;轮数等于队伍数减一。如5支队伍需比赛5轮&#xff0c;6支队伍需比赛5轮。…

云计算行业岗位介绍

云计算、大数据、人工智能作为新一代信息技术产业&#xff0c;未来发展前景不可估量&#xff0c;就业“前途”一片光明。 随着阿里云、腾讯云、华为云为首的国内云厂商的快速发展&#xff0c;释放出来的岗位也越来越多&#xff0c;很多有着“大厂梦”的小伙伴可以通过考取大厂…

拆分单循环链表

设单循环链表L1&#xff0c;对其遍历的结果是x1,x2,……xn。将该循环链表拆分成两个单循环链表L1和L2&#xff0c;使得L1中含有原L1表中序号为奇数的节点&#xff0c;L2中含有原L1表中序号为偶数的节点&#xff1b; #include <iostream> #include<list> using name…

单循环赛 贝格尔编排法实现

原文链接 单循环赛&#xff0c;是指所有参赛队伍都需跟其他队伍比赛一次&#xff0c;根据比赛得分&#xff0c;胜负场次来排列名次。比赛队伍为单数时&#xff0c;轮数等于队伍数&#xff0c;为双数时&#xff0c;轮数等于队伍数减一。如5支队伍需比赛5轮&#xff0c;6支队伍需…

单场淘汰制场次计算方法_怎样用单循环制进行的比赛计算场数

用淘汰制开展的比赛必须的比赛场次较少&#xff0c;而且由于每一轮的不一样比赛能够 在不一样场所另外开展&#xff0c;因此用时较短&#xff0c;因此当报考总数较多时&#xff0c;淘汰赛制是一个很非常好的挑选。可是淘汰赛制有一个很显著的缺陷&#xff0c;假如两位整体实力极…

单循环链表(简称循环链表)

循环链表&#xff08;从任一结点出发&#xff0c;访问到链表全部结点&#xff09; 访问终端结点的时间复杂度 O ( n ) O(n) O(n) 的循环链表形式 访问尾结点的时间复杂度 O ( 1 ) O(1) O(1) 的循环链表形式 这种形式访问开始结点和终端结点都很方便均为 O ( 1 ) O(1) O(1…

单循环链表头指针和尾指针的区别

以如下题目为例&#xff1a; 某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素&#xff0c;则采用&#xff08; D &#xff09;存储方式最节省运算时间。【南开大学2000 一、3】 A&#xff0e;单链表 B&#xff0e;仅有头指针的单循环链表 C&#xff…

单循环比赛赛程 java

原文转自&#xff1a;https://blog.51cto.com/haoroid/1854275 问题&#xff1a;有偶数支羽毛球队进行单循环比赛&#xff0c;按照指定算法将每轮的对阵形势打印出来&#xff1f; 解题思路&#xff1a;单循环制是指每支队伍在比赛是均能相遇一次。可采用U逆时针旋转法进行对局…