一、单向循环链表

单向循环链表也称约瑟夫链表。据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

二、用C语言实现单向循环链表

1、构造存储结构

typedef int datatype;
typedef struct josephus
{datatype data;  /* 数据域 */struct josephus *next;  /* 指针域 */
}josephus_list, *josephus_plist;

2、初始化

初始化主要工作:①申请头结点空间;②head->next=head

/* 初始化 */
void init_josephus_list(josephus_plist *list)
{*list = (josephus_plist)malloc(sizeof(josephus_list));if(NULL == *list){printf("内存申请失败\n");perror("malloc");   /* 打印内存申请失败原因 */exit(1);}(*list)->next = *list;   /* 将next设为NULL,建立空链表 */
}

3、插入

void insert_josephus_list(josephus_plist head, josephus_plist new)
{new->next = head->next;head->next = new;
}

4、删除

删除结点和单向链表的删除思想一样。

void delete_josephus_list(josephus_plist pnode)
{josephus_plist dnode;dnode = pnode->next;pnode->next = dnode->next;free(dnode);
}

5、判断链表是否为空

即判断head是否等于head->next

/* 判断是否为空 */
bool isempty(josephus_plist head)
{if(head == head->next){return true;}else{return false;}
}

5、打印链表

void show_josephus_list(josephus_plist head)
{josephus_plist p = NULL;for(p = head; p->next != head; p = p->next){printf("%d\t", p->data);}printf("%d\n", p->data);
}

三、练习题:实现约瑟夫环

1、创建链表
/* 创建单向循环链表 */
void create_josephus_list(josephus_plist head)
{josephus_plist new = NULL;josephus_plist p = head;int len = 0;int i = 0;printf("输入要插入数据的个数:");scanf("%d", &len);for(i = 0; i < len; i++){if (0 == i){scanf("%d", &(head->data));}else{new = (josephus_plist)malloc(sizeof(josephus_list));if(NULL == new){printf("内存申请失败\n");perror("malloc");exit(1);}printf("输入要插入的第%d个数据:", (i+1));scanf("%d", &(new->data));insert_josephus_list(p, new);p = p->next;}show_josephus_list(head);   /* 打印 */}
}
2、实现约瑟夫
/* n是第n个要删除的结点 */
void josephus(josephus_plist head, int n)
{int i = 0;josephus_plist p = head;while(p != p->next){for(i = 0; i < n-2; i++){p = p->next;}printf("-->%d", p->next->data);delete_josephus_list(p);p = p->next;}printf("-->%d\n", p->data);
}
3、main函数
int main(void)
{josephus_plist head = NULL;        /* 定义一个头指针 */init_josephus_list(&head);   /* 初始化 */create_josephus_list(head);  /* 创建单向链表 */josephus(head, 3);return 0;
}
4、实验结果

四、完整代码

https://github.com/sanjaywu/DataStructure

数据结构手把手教学——单向循环链表相关推荐

  1. 数据结构之单向循环链表

    单向循环链表与单向链表的结点结构相同,每个结点都有一个数据域.一个指针域. 数据域用来存储结点的数据,指针域用来存储下一个结点所在的内存空间地址. 两者不同的是,单向链表末结点的指针域为NULL,而单 ...

  2. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  3. 数据结构--链表--约瑟夫环问题(单向循环链表)

    问题:一群人站成一个圆圈,从一个人开始报数,1, 2 ,...m,报到m的拉出去砍了,求被砍的顺序和最后一个活下来的. 利用单向循环链表实现 C++代码如下:(参考书籍:数据结构与算法实验指导书) # ...

  4. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  5. Day 62 数据结构(单向链表,单向循环链表,双向链表)

    1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...

  6. node 获取表单数据 为空_数据结构与算法(python)单向循环链表

    单向循环链表 单链表的一个变形是单向循环链表, 链表的最后一个节点的next域不再为None, 而是指向链表的头节点. 单向循环链表如图所示: 单向循环链表 同样单向循环链表也是要使用python来对 ...

  7. 数据结构-单向循环链表、双向循环链表、仿真链表

    一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...

  8. 【数据结构与算法】之单向循环链表的创建/遍历/插⼊/查找/删除算法实现

    一.单向循环链表简介 单向循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表. 带头结点的循环单链表的各种操作的算法实现与带头结 ...

  9. 【循环链表】数据结构——单向循环链表和双向循环链表操作笔记

    循环链表 一.单向循环链表 1.单向循环链表的节点 2.单向循环链表的结构 二.双向循环链表 1.双向循环链表示意图 2.双向循环链表节点设计 3.双向循环链表的一般性结构 4.双向循环链表头插法插入 ...

  10. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

最新文章

  1. tensorflow学习笔记(二十五):ConfigProtoGPU
  2. apn java_android设置移动联通电信wap接入点
  3. 用python画小猪佩奇(非原创)
  4. ios可变数组的操作
  5. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤
  6. 正在进行时 Order 1
  7. 使用 python 操作 redis
  8. 数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!
  9. Apache Hadoop 启动报错:masternode:ssh: connect to host master port 22: Connection timed out 总结
  10. 七桥问题c语言程序数据结构,数据结构与算法学习——图论
  11. 物理层传输介质(双绞线、光纤等)
  12. 还原oracle控制文件位置,oracle 11.2 控制文件还原
  13. Iphone获取本地ip地址
  14. 最大最小距离聚类算法c语言,聚类算法-最大最小距离算法(实例+代码)
  15. 再见了SAS9.2,SAS9.2完美卸载方法
  16. 完整卸载SQL Server2008
  17. arduino连接12864LCD方法
  18. MIPS汇编程序设计实验
  19. 诛仙手游android转苹果,诛仙手游安卓和iOS互通吗 安卓和iOS能不能一起玩
  20. 237. 删除链表中的节点 (Delete Node in a Linked List)

热门文章

  1. Excel如何插入可以打钩的方框
  2. 看工业4.0道路上,美国和德国的不同路径
  3. dns服务器优化 360,360DNS优化
  4. python列表所有元素平均值_python—组合数据类型
  5. 笔记 GWAS 操作流程2-1:缺失质控
  6. 高级口译 WordList1
  7. GIS开发:客户端控制的地图样式
  8. android相机代码权限,Android – 相机权限被拒绝而没有提示
  9. 为计算机技术奉献一生语录,关于奉献精神的名言50句
  10. Win10Edge护眼色设置