1、引言
2、问题描述
3、程序构架
数据获取
printf("input total num:");
scanf("%d", &n);
printf("from which num begin:");
scanf("%d", &k);
if(k > n || k == 0) {
printf("please input the right begin num");
return 1;
}
printf("input the out num:");
scanf("%d", &m);
if(m > n || m == 0) {
printf("please input the right del num");
return 2;
}
数据运算
typedef struct node {
int data;
struct node *next;
} linklist;
/* 创建循环链表,头节点也存信息 */
linklist *head = (linklist*)malloc(sizeof(linklist));
linklist *p = head;
p->data = 1;
p->next = p;
/* 初始化循环链表 */
for (int i = 2; i <= n; i++) {
linklist *s = (linklist*)malloc(sizeof(linklist));
s->data = i;
s->next = p->next;
p->next = s;
p = p->next;
}
提高程序运行速率
/* 找到第 k 个节点 */
p = head;
for (int i = 1; i <= k; i++) {
p = p->next;
}
4、逻辑实现
/* 保存节点总数 */
int total = n;
printf("\nthe out num:");
linklist *q = head;
猴子查数
/* 只剩一个节点时停止循环 */
while (total != 1) {
/* 报数过程,p指向要删除的节点 */
for (int i = 1; i < m; i++) {
p = p->next;
}
/* 打印要删除的节点序号 */
printf("[%d] ", p->data);
/* q 指向 p 节点的前驱 */
while (q->next != p) {
q = q->next;
}
/* 删除 p 节点 */
q->next = p->next;
/* 保存被删除节点指针 */
linklist *s = p;
/* p 指向被删除节点的后继 */
p = p->next;
/* 释放被删除的节点 */
free(s);
/* 节点个数减一 */
total--;
}
/* 打印最后剩下的节点序号 */
printf("\n\nthe last num:[%d] \n\n", p->data);
free(p);
5、结论
在本公众号内回复【STM32】可以获取更多关于STM32的视频教程和学习资料。
END
扫描上方二维码加群,回复【加群】或扫码加我好友,限时免费进入技术交流群。
推荐阅读
END
扫描上方二维码加群,回复【加群】或扫码加我好友,限时免费进入技术交流群。
推荐阅读
感谢大家阅读,如果喜欢
请点赞和“在看”吧,或者分享到朋友圈。
点击跳转到原文,限时优惠加入我们的知识星球(加好友获取免费券)