鱼C论坛

 找回密码
 立即注册
查看: 1341|回复: 2

[已解决]函数解释

[复制链接]
发表于 2023-12-18 17:28:08 | 显示全部楼层
这个函数是一个著名的过程,被称为“约瑟夫杀人环问题”。假设有n个人围成一个圈,第一个人从1开始报数,报到m的人就被杀掉。然后下一个人重新开始,从1报数,报到m的人再被杀掉。这样依次下去,直到所有人都被杀掉。这个函数就是用来模拟这个过程的。

每行代码解释如下:

1. `struct node_ st **me,int n`:函数接收两个参数,一个是指向指针的指针me(注意这一点,这是因为我们要修改第一个节点的本身,而不仅仅是它的内容),代表链表的第一个节点,n代表报数的目标值
2. `struct node_ st *node ;`:用于存储被删除节点的前一个节点
3. `struct node_ st *cur = *me ;`:存储当前节点
4. `int i=1 ;`: 报数的起始值
5. `while(cur ! =cur->next )`:当链表中仅有一个节点时退出循环
6. `while(i<n)`:开始逐个报数,报到n前一直循环
7. `node = cur ;`:将当前节点存储为前一个节点
8. `cur=cur ->next ;`:当前节点切换到下一个节点
9. `i++;`:报数加1
10. `printf("%d " ,cur->data);`:输出被删除的节点的数据
11. `node->next = cur->next;`:修改被删除节点的前一个节点的next指针,使其指向当前节点的下一个节点
12. `free(cur);`:释放当前节点(即刚刚被杀掉的人)的内存空间
13. `cur = node->next;`:当前节点切换到下一个节点
14. `i=1 ;`:重新开始报数
15. `me=cur;`:链表的头节点切换到当前节点,这样下一次循环时,就从当前节点开始处理
16. `printf("\n");`:输出一个新行,表示一轮报数结束

为什么这里要用指针的指针?这是因为我们可能会修改链表的头节点(即第一个元素)。在C语言中,如果我们只是传递一个指针,那么我们只能修改这个指针指向的值,而不能修改这个指针本身(即不能让它指向另一个地址)。而在这个函数中,我们需要在删除节点后,修改链表的头节点,所以需要将指针的指针传递进来。

求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-27 10:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表