约瑟夫环问题(Josephus).doc_第1页
约瑟夫环问题(Josephus).doc_第2页
约瑟夫环问题(Josephus).doc_第3页
约瑟夫环问题(Josephus).doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

原题: 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus)提示: 由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动。 为了记录退出的人的先后顺序,采用一个顺序表进行存储。程序结束后再输出依次退出的人的编号顺序。由于只记录各个结点的number值就可以,所以定义一个整型一维数组。如:int quitn;n为一个根据实际问题定义的一个足够大的整数。代码:/* created: 2006/06/14 created: 14:6:2006 17:57 filename: C:Documents and SettingsAdministrator桌面tmppjosephus.c file path: C:Documents and SettingsAdministrator桌面tmpp file base: josephus file ext: c author: A.TNG version: 0.0.1 purpose: 实现 Josephus 环问题 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值, 直至全部输出。写出C程序。(约瑟夫环问题 Josephus)*/#include #include #include #include /* 结构体和函数声明 */typedef struct _node_t int n_num; struct _node_t *next; node_t;node_t *node_t_create(int n);node_t *node_t_get(node_t *pn, int m);/* 功能函数实现 */* * name: node_t_create * params: * n in 输入要构造的链表的个数 * return: * 返回构造成功的环形单向链表指针 * notes: * 构造节点数量为 n 的环形单向链表 * * author: A.TNG 2006/06/14 17:56 */node_t *node_t_create(int n) node_t *p_ret = NULL; if (0 != n) int n_idx = 1; node_t *p_node = NULL; /* 构造 n 个 node_t */ p_node = (node_t *)malloc(n*sizeof(node_t); if (NULL = p_node) return NULL; else memset(p_node, 0, n*sizeof(node_t); /* 内存空间申请成功 */ p_ret = p_node; for (; n_idx n_num = n_idx; p_node-next = p_node+1; p_node = p_node-next; p_node-n_num = n; p_node-next = p_ret; return p_ret;/* * name: main * params: * none * return: * int * notes: * main function * * author: A.TNG 2006/06/14 18:11 */int main() int n, m; node_t *p_list, *p_iter; n = 20; m = 6; /* 构造环形单向链表 */ p_list = node_t_create(n); /* Josephus 循环取数 */ p_iter = p_list; m %= n; while (p_iter != p_iter-next) int i = 1; /* 取到第 m-1 个节点 */ for (; i next; /* 输出第 m 个节点的值 */ printf(%dn, p_iter-next-n_num); /* 从链表中删除第 m 个节点 */ p_iter-next = p_iter-next-next; p_iter = p_iter-next; printf(%dn, p_iter-n_num); /* 释放申请的空间 */ fr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论