1.作业需求

利用循环列表实现约瑟夫环

looplink.h来实现函数声明

#ifndef __LOOPLINK_H__
#define __LOOPLINK_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_show(LoopLink *L);//头删
int list_delete_head(LoopLink *L);//删除头结点
LoopLink *list_kill_head(LoopLink *L);//删除头结点后的遍历
void list_show2(LoopLink *H);//约瑟夫环
void list_josepho(LoopLink *L,int k);#endif

looplink.c来实现函数

#include <stdio.h>
#include <stdlib.h>
#include "looplink.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_show(LoopLink *L)
{//判断逻辑if(NULL==L || list_empty(L)){printf("遍历失败\n");return ;}//定义遍历指针从第一个结点出发LoopLink *p=L->next;//遍历逻辑while(p!=L){printf("%d\t",p->data);p=p->next;}printf("\n");printf("遍历成功\n");return ;}//头删
int list_delete_head(LoopLink *L)
{//判断逻辑if(NULL==L || list_empty(L)){printf("删除失败\n");return 0;}//删除逻辑LoopLink *p = L->next;L->next = p->next;free(p);p=NULL;//表的变化L->len--;printf("删除成功\n");return 1;
}//删除头结点
LoopLink *list_kill_head(LoopLink *L)
{//判断逻辑if(NULL==L ||list_empty(L)){printf("去头失败\n");return NULL;}//定义遍历指针找到最后一个结点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_show2(LoopLink *H)
{//判断逻辑if(NULL == H){printf("遍历失败\n");return ;}//定义遍历指针从第一个结点出发LoopLink *q = H;do{printf("%d\t",q->data);q=q->next;}while(q!=H);printf("\n");printf("遍历成功\n");return ;}//约瑟夫环
void list_josepho(LoopLink *L,int k)
{LoopLink *p=L;LoopLink *q;if(L==NULL){return;}int n=L->len;for(int i=0;i<n;i++){      for(int j=0;j<k-1;j++){           p=p->next;          if(p==L){j--;}}q=p->next;if(q==L){q=L->next;}printf("%d\t",q->data);p->next=q->next;free(q);L->len--;}
}

main1.c来测试函数

#include <stdio.h>
#include "looplink.h"
int main(int argc, const char *argv[])
{//调用创建函数LoopLink *L=list_create();if(NULL==L){return -1;}//调用头插函数list_insert_head(L,3);list_insert_head(L,7);list_insert_head(L,2);list_insert_head(L,1);//调用遍历list_show(L);//调用头删函数list_delete_head(L);list_show(L);//约瑟夫环list_josepho(L,2);return 0;
}

结果如下:

ubuntu@ubuntu:05_day$ gcc looplink.c  main.c
ubuntu@ubuntu:05_day$ ./a.out
创建成功
插入成功
插入成功
插入成功
插入成功
1   2   7   3
遍历成功
删除成功
2   7   3
遍历成功
7   2   3   ubuntu@ubuntu:05_day$ 

循环列表实现约瑟夫环相关推荐

  1. 程序员面试系列——约瑟夫环

    约瑟夫斯问题(Josephus Problem) 约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为"约瑟夫环",也 ...

  2. # R语言——约瑟夫环

    约瑟夫环: n个人围成一个圈,从第一个人点名,每数到第三个人,这个人移出圈外, 依次类推,求最后留下来的人编号是? 思路:每次循环重新编码序号作为names,并根据names 进行筛选 拓展:约瑟夫环 ...

  3. 浙江高考VB之约瑟夫环

    浙江信息技术Giao考之 "约瑟夫环" 在浙江信息技术高考中,有一种题型叫做 约瑟夫环题; 首先,约瑟夫环是什么东西? 鲜活的栗子: 我们现在有6个小朋友,分别标号为1 ~ 6.从 ...

  4. n个人围成一个圈报3,或者约瑟夫环,或者丢手绢

    标题:n个人围成一个圈报3,或者约瑟夫环,或者丢手绢 下面这个视频,可以让你了解什么是约瑟夫环,此后,自己写代码实现一下,可以看看我的代码作为参考, 参考视频: 调用,n=10,编号从1-10,sta ...

  5. 算法科普:什么是约瑟夫环

    1 问题描述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为 k 的人开始报数,数到 m 的那个人出圈:他的下一个人又从 1 开 ...

  6. 约瑟夫环Java实现

    面试中可能经常会遇到约瑟夫环问题,逻辑上很简单,就是看怎么实现了,一般而言,最简单最直观的就是利用链表,然后构建一个循环结构,正好是环,最后计算出结果. 遍历环形链表会是一个无限循环,如果链表中的数据 ...

  7. 7-28 猴子选大王 (20 分),从中学习约瑟夫环

    一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...

  8. java 实现约瑟夫环

    这一次是借鉴模仿别人写的代码,以前觉得不好将数据结构的链结构什么的迁移到java上来使用,但这一次确实让我感受到了可以自己构造数据结构,然后使用类似链的方式来解决约瑟夫环,有所顿悟.不多说,继续上代码 ...

  9. 约瑟夫环数据结构c语言程序,数据结构的C语言(类C语言)--单向循环链表--约瑟夫环...

    代码区 约瑟夫环:用类C语言实现!!!可以成功运行!!!不是仅仅的算法,而是实实在在的类C #include #include typedef int ElemType; typedef struct ...

最新文章

  1. C# winform treeview node添加右键菜单并选中节点
  2. BZOJ 2947 Poi2000 促销 set
  3. webstrom Certificate validation failed
  4. 在C#中重新抛出异常的正确方法是什么? [重复]
  5. 用单片机测量流体流速的_流量测量的主要方法
  6. MySQL命令之mysqlhotcopy -- 热备份
  7. 【C语言】矩阵乘法(二维数组)
  8. 数据库工作笔记002---新建mysql数据库的时候_对字符集和排序规则的选择
  9. libz.dylib的研究 libz.1.2.5.tbd
  10. 4----apache主配置文件模板和基于域名虚拟主机配置文件模板
  11. Jenkins+Ant自动布署war
  12. Atitit 中间件之道 attilax著 1. 第1章 中间件产生背景及分布式计算环境 2 2. 中间件分类 3 2.1. 商业中间件:weblogic,was,conherence 开源中间
  13. 指标公式c语言源码下载,通达信最全指标公式源码,给大家分享实用的技术指标...
  14. PHP文件运行步骤及数据库的连接
  15. (web前端每日一练)用JS制作一个能够在桌面运行的倒计时插件
  16. LambdaQueryWrapper的不同写法
  17. 查看计算机80端口,电脑技巧分享:检测和解决80端口被占用的2种方法
  18. 2013年春节放假通知
  19. 小白神器 - Django - 起步
  20. mysql table already_MySQL优化表时提示 Table is already up to date的解决方法

热门文章

  1. 事件(gridcontrol)总结
  2. 如何安装关于编程类软件
  3. 【数据分析】学生成绩查询系统含Matlab源码
  4. springboott提搞并发量
  5. ubuntu 进入紧急救援模式
  6. ArcGIS教程:检查空间自相关和方向变化
  7. 配置及执行spark、hadoop遇到的几个报错解决
  8. DataFrame获取列名
  9. 第十一届蓝桥杯 C/C++ 大学A组/研究生组 E题 咫尺天涯dp做法
  10. 2019-mathorcupB题-环形穿梭机调度模型(思路篇)