传说有30个乘客同乘一条船,因为严重超载,加上风浪水作,危险万分。船长告诉乘客,只有将全船一半的乘客投入海 中,其余人才能幸免于难。他们约定了一个规则:30个人围成一圈,由第一个人数起,依次报数,数到第9个人,便把他投入大海中,然后再从他的下一个人数起,数到第9个人,再将其扔下大海,如此循环地进行,直到剩下15个乘客为止。请问哪些位置是将被扔下大海的位置,留下的是谁。

(由这个传说产生了约瑟夫问题,总数n,删除数为k)

最后我写了一个函数是将结果输出到外部文本txt中。

我所写出的循环链表是基于单链表来写的:简而言之就是,首先,生成我们所学过的单链表(我这里采用的是头插法),每次生成一个空间,就将该空间的成员信息进行赋初值,也就是把结构里面所定义的成员的位置信息进行赋值(如:第一个成员的位置信息就是1,接下去就是2,3,4....)

PS:需要注意的是,我这里是头插法,所以我在位置信息的时候是从30开始,最后整个单链表生成之后就是从1开始的一个正向顺序的链表。 当然你也可以选择把整个单链表生成之后再进行赋值,这样可能会更清晰,我这里是边想边写,就没有考虑到这么多。

准备工作完成之后,你就可以把单链表的尾部指针,和头部指针,将这两个指针连接起来(尾部指针就是指向NULL的那个指针),记住一定是尾部指针指向头部指针,也就是把头部指针赋值给尾部指针,千万不能把头部指针指向尾部,因为这样的话你就是把你的单链表结构破坏掉了。

最后是输出环节,看过我文章 的小伙伴应该都知道,想要输出内容到txt文本流应该要用fprintf,不然你就是大冤种,在输出中文字符的时候没有用fprintf就会乱码,当然我这里没有输出中文字符,但是养成好习惯,在当你想输出文本流的时候一般情况下都建议你去使用fprintf。

(忘记了的朋友可以看看我这篇博客的文字部分:http://t.csdn.cn/Pue8v

下面是源代码:

(耐心看完,不懂得可以留言,我知道的话都会回复的,毕竟讨论代码是更能让人记忆深刻)

#include<stdio.h>
#define PF(format,...) printf(#format, ##__VA_ARGS__)
#include<stdlib.h>
int n = 30;//总数
int k = 9; //待删除的总数
/*
循环链表, 从头开始,
判断总数是否小于n/2个,
a)不是那就每数到第k个就删除节点
指向下一个节点
b)如果小于等于n/2那就退出,将链表中生剩下的元素打印进txt文件
*/ typedef struct _circu_link{ int index;//成员下标
int member;//成员
struct _circu_link *next; }circu_link; circu_link *mem_H = NULL;//成员信息 void Initmember();//初始化结构 void Delete_mem();//删除信息 void PF_result(); void Put_TXT(); void Release_mem(); int main(void)
{
Initmember();//初始化
Delete_mem();//符合条件的成员将其删除
PF_result();//打印结果
Put_TXT();//将结果存到外部txt文件
Release_mem();
return 0;
}
void Initmember()//初始化结构
{
circu_link *temp, *new_member;
int i;
for(i = n; i >= 1; i--)
{
new_member = (circu_link*)malloc(sizeof(circu_link));
if(new_member == NULL)
{
PF(分配内存失败!\n);
exit(1);
}
if(mem_H == NULL)
{
mem_H = new_member;
new_member->index = i;
new_member->next = NULL;
}
else
{
temp = mem_H;
mem_H = new_member;
new_member->index = i;
new_member->next = temp;
}
}
temp = mem_H;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = mem_H;//生成循环链表
// temp = mem_H;
// for(i = 0; i < 60; i++)
// {
// PF(%d****, temp->index);
// temp = temp->next;
// } } void Delete_mem()
{
circu_link *previous = NULL, *current, *temp;;
current = mem_H;
int i = 0, count = 0;
while(1)
{
if(i >= n/2)//判断是否已经删除掉n/2的成员
{
break;
}
else
{
count++;
previous = current;
current = current->next;
}
if(count == k-1)
{
count = 0;
i++;
temp = current;
previous->next = current->next;//删除
free(temp);
current = previous->next;
}
}
} void PF_result()
{
circu_link *temp;
int i;
temp = mem_H;
PF(大难不死的成员如下:\n);
for(i = 0; i < n/2; i++)
{
PF(-%d-, temp->index);
temp = temp->next;
}
PF(\n);
} void Put_TXT()
{
FILE *fp = NULL;
circu_link *temp = mem_H;
int i;
fp = fopen("D:/D/约瑟夫问题/Put.txt", "w");
for(i = 0; i < n/2; i++)
{
fprintf(fp, "%d-",temp->index);
temp = temp->next;
}
fclose(fp);
} void Release_mem()
{
int i;
circu_link *temp = NULL;
for(i = 0; i < n/2; i++)
{
temp = mem_H;
mem_H = mem_H->next;
free(temp);
}
}

外部文件也同样生成了:

C语言:约瑟夫问题——使用循环链表解决的更多相关文章

  1. C++循环链表解决约瑟夫环问题

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以 ...

  2. C语言单向循环链表解决约瑟夫问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,4 ...

  3. golang数据结构之用循环链表解决约瑟夫环问题

    josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...

  4. 约瑟夫环问题-循环链表VS数组

    2013-08-18 21:27:50 循环链表.数组解决约瑟夫环问题的比较 注意几点: 循环链表的建立不难,在删除循环链表中元素时,用pCur->next != pCur判断结束: 每一轮计数 ...

  5. 约瑟夫环的java解决

    总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...

  6. 【IE兼容性】代码中多语言样式+IE不兼容解决

    一.代码中样式根据不同语言对IE做不兼容解决 二.代码逻辑: 1. 后台返回语言信息: result.addObject("language",getLocaleStr());   ...

  7. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...

  8. Titanium中调用ios组件时语言不是本地化的解决方法

    用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...

  9. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  10. C语言 约瑟夫圈问题:N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。

    样例输入3  输出2 输入100   输出91 代码及分析: #include<stdio.h> int main() { int i,n,N,out,a[1000]; out=i=n=0 ...

随机推荐

  1. OpenHarmony将携新成果亮相HDC2022

     第四届华为开发者大会 2022(Together)将于11月4日-6日在东莞召开,OpenAtom OpenHarmony(以下简称"OpenHarmony")将携新生态成果亮相 ...

  2. 6. Eigenvalues and Eigenvectors

    Keys: What are Eigenvalues and Eigenvectors? How to find Eigenvalues and Eigenvectors? Applications ...

  3. 【Insights直播】华为帐号服务,打造全场景安全帐号体系

    在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...

  4. 20个Python 正则表达式应用与技巧

    本文分享自华为云社区<Python 正则表达式大揭秘应用与技巧全解析>,作者:柠檬味拥抱. Python 中的 re 模块是用于处理正则表达式的强大工具.正则表达式是一种用来匹配字符串的模 ...

  5. ArkUI,更高效的框架设计

     原文:https://mp.weixin.qq.com/s/uSIzuBby7Z92drNDmejKXw,点击链接查看更多技术内容.     上期文章我们讲到了ArkUI的三大特性,同时提到了Ark ...

  6. Linux-搭建内网yum源

    部署要求: 服务器:CentOS7 YUM源:阿里云 空间要求:CentOS6+CentOS7 50G,考虑后期更新预留,LVS空间100G 1.在服务器配置CentOS7的yum源和CentOS6的 ...

  7. 保护C#代码的艺术:深入浅出代码混淆技术

    摘要 在C#开发中,代码的保护是一个不可忽视的问题.本文深入探讨了几种常用的C#代码混淆工具,帮助开发者理解如何有效地保护代码不被反编译.同时,本文也对混淆技术的优缺点进行了分析,并提供了一些实际使用 ...

  8. mysql 必知必会整理—数据插入和更新还有删除[十]

    前言 简单整理数据插入更新还有删除. 正文 插入: INSERT INTO customers( customers.cust_address, customers.cust_city, custom ...

  9. Webpack中常见的Loader?解决了什么问题?

    一.是什么 loader 用于对模块的源代码进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打 ...

  10. Django框架——csrf跨站请求伪造、csrf校验、csrf相关装饰器、auth认证、auth认证相关模块及操作

    csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是 ...