约瑟夫环(C语言实现)

问题描述:约瑟夫环问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试设计一个程序求出出列顺序。

基本要求:利用单向循环链表模拟此过程,按照出列的顺序印出各人的编号。

测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。

实现提示:程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n<=30。此题所用的循环链表中不需要头结点,注意空表和非空表的界限。

选做内容:向上述程序中添加在顺序结构中实现的部分。

LinkList.h

#pragma oncetypedef enum
{OK = 1,ERROR = 0
}Status;typedef void* ElemType;
#ifdef __cplusplus
extern "C" {#endif // __cplusplus/* 链表结点定义*/typedef struct LNode{ElemType data;             // 结点数据域struct LNode* next;         // 结点指针域}LNode, *LinkList;/// @brief 链表初始化/// @param LinkList& L/// @return StatusStatus InitList(LinkList* L);/// @brief 创建循环单链表/// @return LinkListLinkList CreateList();/// @brief 尾插法插入元素/// @param L_rear 尾指针/// @param e 数据/// @return Status codeStatus ListInsert_R(LinkList* L_rear, ElemType e);/// @brief 链表结点删除/// @param L 尾指针/// @param i 删除位置/// @return StatusStatus ListDelete(LinkList* L_rear, int i, ElemType* e);/// @brief 循环单链表的遍历/// @param L_rear 尾指针/// @param visit 回调函数void ListTraversal(LinkList L_rear, void(*visit)(void*));/// @brief 根据数据值定位元素/// @param L_rear 尾指针/// @param e 数据/// @param cmp 回调函数 比较数据值是否相同/// @return 结点指针LNode* LocateElem(const LinkList L_rear, const ElemType e, int(*cmp)(const ElemType, const ElemType));#ifdef __cplusplus
}
#endif // __cplusplus

LinkList.cpp

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"#define CIRCLED_LIST_WITHOUT_HEAD#ifdef CIRCLED_LIST_WITHOUT_HEAD
int DefaultCmp(const ElemType e1, const ElemType e2)
{return e1 == e2;
}void DefaultVisit(void* data)
{printf("%p\n", data);
}LinkList CreateList()
{return NULL;
}Status InitList(LinkList* L)
{*L = NULL;return OK;
}int ListEmpty(const LinkList L)
{if (!L) return 1;return 0;
}/// @brief 链表按值查找/// @param L 尾指针/// @param e 所查结点值/// @return 查找成功返回结点地址值,查找失败返回NULL
LNode* LocateElem(const LinkList L_rear, const ElemType e, int(*cmp)(const ElemType, const ElemType))
{if (ListEmpty(L_rear)) return NULL;if (!cmp) cmp = DefaultCmp;if (cmp(L_rear->data, e)) return L_rear;LNode* p = L_rear->next;while (p != L_rear){if (cmp(p->data, e)) break;}return p;
}Status ListInsert_R(LinkList* L_rear, ElemType e)
{if (!e) return ERROR;LNode* node = (LNode*)malloc(sizeof(LNode*));if (!node){perror("内存分配失败");return ERROR;}node->data = e;if (ListEmpty(*L_rear))  // 尾指针为空,即链表为空{*L_rear = node;node->next = node;}else{node->next = (*L_rear)->next;(*L_rear)->next = node;*L_rear = (*L_rear)->next;}return OK;
}Status ListDelete(LinkList* L_rear, int pos, ElemType* e)
{if (ListEmpty(*L_rear)) return ERROR;LNode* rear = *L_rear;LNode* head = rear->next;int i = 1;LNode* pCur = head;LNode* prev = rear;while (i < pos){prev = prev->next;pCur = pCur->next;++i;}if (prev->next == pCur->next)*L_rear = NULL;else{prev->next = pCur->next;// 根据约瑟夫环的要求,更新尾指针*L_rear = prev;}*e = pCur->data;/*if (!pCur){free(pCur);pCur = NULL;}*/return OK;
}void ListTraversal(LinkList L_rear, void(*visit)(void*))
{if (!L_rear) return;if (!visit) visit = DefaultVisit;LNode* p = L_rear->next;while (p != L_rear){visit(p->data);p = p->next;}visit(L_rear->data);}#endif // CIRCLED_LIST_WITHOUT_HEAD

main.cpp

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"#define N 100
struct Node{/* initial number */int no;/* message*/int m;
};void visit(void* data)
{struct Node* node = (struct Node*)data;printf("no: %d, m: %d\n",node->no, node->m);
}void JosephCircle(int arr[], int n, int m)
{LinkList L_rear = CreateList();InitList(&L_rear);for (int i = 1; i <= n; ++i){struct Node *node = (struct Node*)malloc(sizeof(struct Node));if (!node){perror("内存分配失败\n");exit(-1);}node->m = arr[i - 1];node->no = i;ListInsert_R(&L_rear, node);}while (L_rear){ElemType data = NULL;ListDelete(&L_rear, m, &data);m = ((struct Node*)data)->m;visit(data);}
}void banner()
{printf("****************************************************\n\n");printf("                   实验二:约瑟夫环                  \n\n");printf("****************************************************\n\n");
}int main()
{banner();int m = 0,n = 0,arr[N] = { 0 };printf("请输入m的初值:\n");scanf("%d", &m);printf("请输入n的值:\n");scanf("%d", &n);printf("请输入%d个人的m值:", n);for (int i = 0; i < n; ++i)scanf("%d", &arr[i]);JosephCircle(arr, n, m);return EXIT_SUCCESS;
}

约瑟夫环(C语言实现)相关推荐

  1. python约瑟夫环_Python语言之如何实现约瑟夫环问题

    本文Python语言实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,希望对大家学习Python语言有所帮助,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0 ...

  2. 约瑟夫环--C语言解析

    约瑟夫环问题 约瑟夫环:在我们C语言的初学基础中,会遇到魔方阵,做游戏踢出 队列.都要用到循环数组.魔方阵之前有讲解,今天只说做游戏踢出队列. 这类问题有很多说法.现在我们说做游戏退出:有n个人,在一 ...

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

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

  4. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

  5. 杀人游戏约瑟夫环(洛谷P1145题题解,Java语言描述)

    题目要求 题目链接P1145 约瑟夫环问题了解一下 约瑟夫环问题其实在数据结构里与单循环链表关系密切,但是这里模拟就完事~~ 我写过的约瑟夫环问题 AC代码(Java语言描述) import java ...

  6. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc

    数据结构约瑟夫环实验报告.doc 数据结构与算法设计约瑟夫环实验报告实验一专业物联网工程班级物联网1班学号15180118姓名刘沛航一. 实验目的 1.熟悉VC环境,学习使用C语言利用链表的存储结构解 ...

  7. 约瑟夫环的c语言描述

    约瑟夫环的c语言描述 问题描述 代码(C语言) 问题描述 约瑟夫(Joseph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈.每人持有一个密码(正整数).一开始任选一个正整数作为 ...

  8. 约瑟夫环问题(C语言循环链表)

    1.约瑟夫环问题(C语言循环链表) 我相信大家都可以画出这个图,知道大体的解题的思想,但是却不知道代码该怎么下手,因此,下面我直接上代码,代码中该注释的地方我都进行了注释,希望到大家有帮助: #inc ...

  9. C语言使用数组和循环解决约瑟夫环问题

    C语言使用数组和循环解决约瑟夫环问题 约瑟夫入狱,监狱内共有 33 个犯人.某日 33 名犯人围成一圈,从第一个犯人开始报数,报到数字 7 的犯人出列, 被枪毙,下一名犯人重新从 1 开始报数.依次类 ...

  10. 约瑟夫环c语言代码顺序存储,顺序表实现约瑟夫环地问题,C语言.doc

    顺序表实现约瑟夫环地问题,C语言 计算机科学与工程学院 PAGE PAGE 2 <算法与数据结构>试验报告 计算机科学与工程学院 <算法与数据结构>试验报告[一] 专业班级 1 ...

最新文章

  1. 用深度学习解决大规模文本分类问题
  2. 为什么微软溢价50%并购LinkedIn:估值、增长、变现和背后的魔法
  3. C#调用百度地图API入门解决BMap未定义问题
  4. FastDFS安装与部署
  5. 如何保护电路不被烧毁?
  6. python中string数据库_python – 将字节字符串保存到数据库中的v...
  7. 8次c语言上机作业答案,计算机二级C语言上机题库及答案2017
  8. OSChina 周日乱弹 ——已经打码请放心观看
  9. 数据结构之排序算法:并归排序
  10. Linux 进程状态 说明
  11. [转载] python之numpy的基本使用
  12. MySQL grant、revoke 用户权限注意事项
  13. python模块之subprocess
  14. 如何关闭极域课堂(亲测有效)(含下载链接)
  15. 微信点餐 创建订单报外键错误
  16. 期货市场对农业的影响
  17. 360又抢了12306的风头:它为什么能提前49天订票?
  18. 程序员必学电脑计算机专业英语词汇 07 (142 单词)
  19. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】
  20. CTF-密码学-bacon

热门文章

  1. 思考小型管理软件的诸多问题:附美萍部分客户的销售统计表
  2. 单片机C语言程序设计心得,单片机课程设计心得体会
  3. 修改Oracle密码
  4. 【Pytorch神经网络理论篇】 40 Transformers中的词表工具Tokenizer
  5. 使用Java生成PDF文件
  6. Kotlin基础从入门到进阶系列讲解(Android开发) - 总目录
  7. linux文件映射mmap
  8. Reinforcement Learning[论文合集]
  9. QTP下载地址及破解方法
  10. 7.13 Python循环语句(2)、number、字符串