约瑟夫环(改进3.0)
又改进了了一些问题
//使用循环链表来解决约瑟夫环问题
//需要对链表实现的功能:
//1. 初始化链表节点值
//2. 删掉对应元素
//3. 返回对应值和序号
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct LinkNode{
int number;// 序号
int data;// 所带密码
struct LinkNode* next;// 指向下一个节点的指针
}LinkNode, *LinkList;// 指向结构体的指针
// 设立尾指针的单循环链表
Status ListInit_CL(LinkList &L, int given_people){
LinkList l = (LinkList)malloc(sizeof(struct LinkNode));
if (!l){
exit(OVERFLOW);
}
L = l;// L就当作首,方便最后传出时,L没有变化
int index;
srand((unsigned)time(NULL));
for (index = 1; index < given_people; index++){
l->number = index;
l->data = rand() % 10 + 1;
LinkList q = (LinkList)malloc(sizeof(struct LinkNode));// 临时存储
if (!q) // 分配失败
return OVERFLOW;
// 不断新增节点
l->next = q;
l = q;
}
l->number = index;
l->data = rand() % 10 + 1;
l->next = L;
return OK;
}
// 删除第i个元素,并由number返回其序号
Status ListDelete_CL(LinkList &L, int i, int &number, int &data){
LinkList q;
int j;
if (i > 1){
for (j = 1; j < i-1; j++){
// 移动到i个节点前
L = L->next;
}
q = L->next;// q指向待删除结点
L->next = q->next;// L->next指向被删除节点的下一个
L = L->next;
}
else if (i == 1){
q = L;//q指向第一个有效位
for (j = 0;; j++){
// 移动到最后面,使最后指向第二个有效位,并移动过去
L = L->next;
if (L->next == q){
L->next = q->next;
L = L->next;
break;
}
}
}
else{
return ERROR;
}
//返回被删除节点序号
//q被删除,L位于q的下一个节点上
number = q->number;
data = q->data;
free(q);
return OK;
}
int main(){
int i, rand_num, given_people;
printf("请输入:初始人数n,初始密码m\n");
scanf("%d %d", &given_people, &rand_num);
if (given_people <= 0 || rand_num <= 0){
return ERROR;
}
LinkList L = NULL;
if (!ListInit_CL(L, given_people)){
return ERROR;
}
int index, get_number, get_data;
for (index = 0; index < given_people - 1; index++){
ListDelete_CL(L, rand_num, get_number, get_data);
printf("前一随机数-->%d,被剔除的人-->%d, 自身随机数-->%d\n", rand_num, get_number, get_data);
rand_num = get_data;
}
printf("==============================================\n前一随机数-->%d,被剩下的人-->%d, 自身随机数-->%d\n",
rand_num, L->number, L->data);
return OK;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)