用循环链表编程实现约瑟夫问题,n个人围成一圈,从某人开始报数1,2,.., m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程,直到全部人出圈,于是得到一个出圈人员的新序列,如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列为4,8,5,2,1,3,7,6。

//约瑟环问题
void josepho(LoopLink *l,int k){if(NULL==l || list_empty(l) || k<0 ){printf("所给链表不合法或所给数太小,无法解决问题\n");return;}int n=l->len; //循环次数,n个人循环n次LoopLink *p=list_kill_head(l); //对链表进行去头操作l=NULL;LoopLink *q;  //定义指针,用来标记删除的结点for(int i=0;i<n;i++){for(int j=1;j<k-1;j++){p=p->next;}q=p->next;printf("%d\t",q->data);p->next=q->next;free(q);}putchar(10);
}

运行结果:

主函数代码:

#include <stdio.h>
#include "looplist.h"int main(int argc, const char *argv[])
{//创建LoopLink *l=list_create();if(NULL==l){printf("创建失败\n");return 0;}//头插list_insert_head(l,1);list_insert_head(l,3);list_insert_head(l,5);list_insert_head(l,7);list_insert_head(l,9);list_display(l);//约瑟环问题josepho(l,3);return 0;
}

定义函数代码:

#include <stdio.h>
#include <stdlib.h>
#include "looplist.h"//创建
LoopLink *list_create(){LoopLink *l=(LoopLink *)malloc(sizeof(LoopLink));if(NULL==l){printf("创建失败\n");return NULL;}//初始化l->len=0;l->next=l;//将指针指向自己printf("创建成功\n");return l;
}//判空
int list_empty(LoopLink *l){return l->next==l;
}//头插
int list_insert_head(LoopLink *l,datatype e){if(NULL==l){printf("所给链表不合法\n");return 0;}//申请结点封装数据LoopLink *p=(LoopLink *)malloc(sizeof(LoopLink));if(NULL==p){printf("结点申请失败\n");return 0;}p->data=e;p->next=NULL;//头插p->next=l->next;l->next=p;l->len++;printf("插入成功\n");return 1;
}//遍历
void list_display(LoopLink *l){if(NULL==l || list_empty(l)){printf("遍历失败\n");return;}LoopLink *q=l->next;while(q!=l){printf("%d\t",q->data);q=q->next;}putchar(10);
}
//头删
int list_delete_head(LoopLink *l){if(NULL==l || list_empty(l)){printf("删除失败\n");return 0;}LoopLink *q=l->next;l->next=q->next;free(q);q=NULL;l->len--;printf("删除成功\n");return 1;
}
//删除头结点
LoopLink *list_kill_head(LoopLink *l){if(NULL==l || list_empty(l)){printf("去头失败\n");return 0;}//定义遍历指针指向最后一个结点LoopLink *q=l->next;while(q->next!=l){q=q->next;}q->next=l->next;free(l);l=NULL;printf("去头成功\n");return q->next;
}
//删除头结点后的遍历
void list_display_noh(LoopLink *h){if(NULL==h){printf("遍历失败\n");return;}LoopLink *q=h;do{printf("%d\t",q->data);q=q->next;}while(q != h);putchar(10);
}
//约瑟环问题
void josepho(LoopLink *l,int k){if(NULL==l || list_empty(l) || k<0 ){printf("所给链表不合法或所给数太小,无法解决问题\n");return;}int n=l->len; //循环次数,n个人循环n次LoopLink *p=list_kill_head(l); //对链表进行去头操作l=NULL;LoopLink *q;  //定义指针,用来标记删除的结点for(int i=0;i<n;i++){for(int j=1;j<k-1;j++){p=p->next;}q=p->next;printf("%d\t",q->data);p->next=q->next;free(q);}putchar(10);
}

头文件:

#ifndef __LOOPLIST_H__
#define __LOOPLIST_H__typedef int datatype;
typedef struct Node
{union{int len;          //头结点数据域datatype data;     //普通节点数据域    };struct Node *next;         //指针域
}LoopLink;//创建
LoopLink *list_create();
//判空
int list_empty(LoopLink *l);
//头插
int list_insert_head(LoopLink *l,datatype e);
//遍历
void list_display(LoopLink *l);
//头删
int list_delete_head(LoopLink *l);
//删除头结点
LoopLink *list_kill_head(LoopLink *l);
//删除头结点后的遍历
void list_display_noh(LoopLink *h);
//约瑟环问题
void josepho(LoopLink *l,int k);#endif

Makefile:

TARGET:=a.outOBJS:=looplist.o main.oCC:=gccCFLAGS:=-oCFLAGSs:=-c -o$(TARGET):$(OBJS)$(CC) $(OBJS) $(CFLAGS) $(TARGET)%.o:%.c$(CC) $*.c $(CFLAGSs) $*.o.PHONY:clean
clean:rm *.o a.out

约瑟环问题(全部代码在本文下方)相关推荐

  1. c/c++常用算法(14) -- 经典数据结构(约瑟环夫问题)

    一.简单的约瑟环夫 1.故事描述: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被 ...

  2. Josephus约瑟环问题

    约瑟环问题描述:n个人有序围成一圈报数,报到M的就退(自)出(杀),再从头开始报数,由此循环,求剩下最后一人的序号. 第一种直觉的想法是弄个list循环: int Josephus(unsigned ...

  3. 约瑟环问题 Java解法

    约瑟环问题: 17世纪的法国数学家加斯帕在<数目的游戏问题>中讲的一个故事,15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法,30个人围 ...

  4. 约瑟环的python实现(举例说明)

    题目是: N个人围成一圈报数,报到某一个数m的就出局,问你最后剩下来的人的号码? 网上通用约瑟夫环的算法是: //函数接收n和m,返回最后出圈的是第几个人 /*e.g. yuesefu(5,2)=3 ...

  5. 约瑟环问题JAVA(数组)

    所有人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数), 凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长. 请你通过编写程序,求出一组人中的队长是原来第几位同学.(约瑟 ...

  6. Offer 62. 约瑟环(规律问题-递归-中等)

    Offer 62. 圆圈中最后剩下的数字 思路1:⭐ 创建一个下标为 0~n-1的数组 | 当n=5时 nums = [1 1 1 1 1] 代表下标为i的数是否已经被删除⭐ 通过不断(外层设置一个循 ...

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

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

  8. 约瑟夫环c语言代码 指针,约瑟夫环C语言实现源代码(1)

    前天笔试有个约瑟夫环的问题,怪不得人家没通知我面试,原来我的约瑟夫环做的确实有问题,昨天晚上又重新做了下,下面上源代码: /* file:osephu.cpp author:www.5dkx.com ...

  9. 约瑟环c语言,顺序表实现约瑟环的问题,C语言.doc

    计算机科学与工程学院 <算法与数据结构>试验报告[一] 专业班级 10级计算机工程02 试验地点 计算机大楼计工教研室 学生学号 1005080222 指导教师 蔡琼 学生姓名 肖宇博 试 ...

最新文章

  1. Nature:如何在学术报告中讲述一个引人入胜的故事!
  2. ARP缓存记录种类动态条目和静态条目
  3. 机器人动力学方程的性质
  4. C++ 继承Employee类
  5. python文件拷贝并校验_初级版python登录验证,上传下载文件加MD5文件校验
  6. linux 进程装入 物理内存 页表,linux内存管理解析----linux物理,线性内存布局及页表的初始化...
  7. php防止订单重复计算,php防止用户重复提交表单
  8. IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决
  9. zune linux_更新您的Zune Player软件
  10. jqueryui / accordion的用法记录
  11. app内嵌h5页面在ios手机端滑动卡顿的解决方法
  12. python在信号处理的应用_Python和信号处理程序
  13. 狼来了!中国房地产的实质--比喻太生动了
  14. Pentaho的Mondrian对Hive的支持
  15. 基建管控系统_基建项目管理系统
  16. Android 中使用AlarmManager设置闹钟详解
  17. 台式计算机c盘怎么清理空间,怎么样清理台式机c盘空间
  18. 计算机教程求和,excel筛选求和的方法步骤图
  19. 腾讯短网址在线生成(url.cn短网址) 2020最新腾讯短网址生成api接口推荐
  20. C++ COM组件编写初探(上)

热门文章

  1. [bzoj1017]:[JSOI2008]魔兽地图DotR
  2. 第27章 登录/注销的定义实现
  3. 92天寒窗苦学,泪谈京东三面+交叉面经历,终获30K*14薪
  4. 【面试】My first interview_大联大商贸有限公司(深圳)
  5. Unity3D制作 页码动态排列效果
  6. 水性气凝胶涂料的制备方法,具体实施方式举例
  7. 如何将音乐从iTunes传输到Android
  8. LaTex实战笔记 5-段落格式
  9. 脚本_根据 md5 校验码,检测文件是否被修改
  10. ext 中 columnModel的renderer