循环列表实现约瑟夫环
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$
循环列表实现约瑟夫环相关推荐
- 程序员面试系列——约瑟夫环
约瑟夫斯问题(Josephus Problem) 约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为"约瑟夫环",也 ...
- # R语言——约瑟夫环
约瑟夫环: n个人围成一个圈,从第一个人点名,每数到第三个人,这个人移出圈外, 依次类推,求最后留下来的人编号是? 思路:每次循环重新编码序号作为names,并根据names 进行筛选 拓展:约瑟夫环 ...
- 浙江高考VB之约瑟夫环
浙江信息技术Giao考之 "约瑟夫环" 在浙江信息技术高考中,有一种题型叫做 约瑟夫环题; 首先,约瑟夫环是什么东西? 鲜活的栗子: 我们现在有6个小朋友,分别标号为1 ~ 6.从 ...
- n个人围成一个圈报3,或者约瑟夫环,或者丢手绢
标题:n个人围成一个圈报3,或者约瑟夫环,或者丢手绢 下面这个视频,可以让你了解什么是约瑟夫环,此后,自己写代码实现一下,可以看看我的代码作为参考, 参考视频: 调用,n=10,编号从1-10,sta ...
- 算法科普:什么是约瑟夫环
1 问题描述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为 k 的人开始报数,数到 m 的那个人出圈:他的下一个人又从 1 开 ...
- 约瑟夫环Java实现
面试中可能经常会遇到约瑟夫环问题,逻辑上很简单,就是看怎么实现了,一般而言,最简单最直观的就是利用链表,然后构建一个循环结构,正好是环,最后计算出结果. 遍历环形链表会是一个无限循环,如果链表中的数据 ...
- 7-28 猴子选大王 (20 分),从中学习约瑟夫环
一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不 ...
- java 实现约瑟夫环
这一次是借鉴模仿别人写的代码,以前觉得不好将数据结构的链结构什么的迁移到java上来使用,但这一次确实让我感受到了可以自己构造数据结构,然后使用类似链的方式来解决约瑟夫环,有所顿悟.不多说,继续上代码 ...
- 约瑟夫环数据结构c语言程序,数据结构的C语言(类C语言)--单向循环链表--约瑟夫环...
代码区 约瑟夫环:用类C语言实现!!!可以成功运行!!!不是仅仅的算法,而是实实在在的类C #include #include typedef int ElemType; typedef struct ...
最新文章
- C# winform treeview node添加右键菜单并选中节点
- BZOJ 2947 Poi2000 促销 set
- webstrom Certificate validation failed
- 在C#中重新抛出异常的正确方法是什么? [重复]
- 用单片机测量流体流速的_流量测量的主要方法
- MySQL命令之mysqlhotcopy -- 热备份
- 【C语言】矩阵乘法(二维数组)
- 数据库工作笔记002---新建mysql数据库的时候_对字符集和排序规则的选择
- libz.dylib的研究 libz.1.2.5.tbd
- 4----apache主配置文件模板和基于域名虚拟主机配置文件模板
- Jenkins+Ant自动布署war
- Atitit 中间件之道 attilax著 1. 第1章 中间件产生背景及分布式计算环境	2 2. 中间件分类	3 2.1. 商业中间件:weblogic,was,conherence 开源中间
- 指标公式c语言源码下载,通达信最全指标公式源码,给大家分享实用的技术指标...
- PHP文件运行步骤及数据库的连接
- (web前端每日一练)用JS制作一个能够在桌面运行的倒计时插件
- LambdaQueryWrapper的不同写法
- 查看计算机80端口,电脑技巧分享:检测和解决80端口被占用的2种方法
- 2013年春节放假通知
- 小白神器 - Django - 起步
- mysql table already_MySQL优化表时提示 Table is already up to date的解决方法