线性表---单循环链表(约瑟夫环问题)
2015-10-19 14:52
288 查看
约瑟夫环问题:
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
代码:
结果:
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
代码:
#include <iostream> #include <stdio.h> #include<malloc.h> using namespace std; typedef struct CycleList{ int data; struct CycleList *next; }CLNode; void Josephus(int n, int k, int m) {//n为总人数,k为第一个开始报数的人,m为出列者报的数 /*---------------------------创建循环单链表--------------------------*/ CLNode *head, *p, *q; //先建立一个只有一个节点的循环链表head,然后用循环逐渐往里追加节点!!! head = (CLNode*)malloc(sizeof(CLNode)); head->data = 1; head->next = head; //追加节点 p = head; for(int i=2; i<=n;i++) { q = (CLNode*)malloc(sizeof(CLNode)); q->data = i; //插入 p->next = q; p = q; } p->next = head;//最后一个节点指向头部,形成循环链表 /*---------------------------创建循环单链表--------------------------*/ /*---------------------------打印原始链表--------------------------*/ CLNode *pr; //(1) pr=head; //(2) while(pr)//!!!! { printf("%d ",pr->data); //(3) pr=pr->next; //(4) if(pr->data == head->data)//单循环增加 break; } cout<<endl; /*---------------------------打印原始链表--------------------------*/ /*------------------------找到最开始报数的节点---------------------*/ CLNode *r1, *r2, *r3; r1 = head;//注意:head节点有数据,也就是所谓的没有头结点 while(k--) {//找到最开始报数的节点 r2 = r1;//r2为最开始报数的节点 r1 = r1->next; } //打印最开始报数的节点 cout<<r2->data<<endl; /*------------------------找到最开始报数的节点---------------------*/ /*-----------------------------依次删除--------------------------*/ while(n--) {//每报到m则删除一个节点,直至全部出列 for(int j=1; j<m; j++) { r3 = r2;//r3为r2的前一节点!!! r2 = r2->next;//r2为要删除的节点 } r3->next = r2->next; if(r2->next == r2)//最后一个元素 cout<<r2->data<<endl; else cout<<r2->data<<"->"; free(r2); r2 = r3->next;//重置每次开始报数的节点(删除节点的下一个) } /*-----------------------------依次删除--------------------------*/ } int main(){ Josephus(6,4,2); return 0; }
结果:
1 2 3 4 5 6 4 5->1->3->6->4->2 Process returned 0 (0x0) execution time : 0.070 s Press any key to continue.
相关文章推荐
- java线性表排序示例分享
- php线性表的入栈与出栈实例分析
- C++语言实现线性表之数组实例
- C语言线性表的顺序表示与实现实例详解
- C++语言实现线性表之链表实例
- 简单介绍线性表以及如何实现双链表
- Go语言实现顺序存储的线性表实例
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 结构之美:定义一个线性表
- 结构之美:线性表的查找、插入与删除操作
- 线性表的概念、结构与基本操作
- 结构之美:线性表的链式存储结构——链表
- 线性表的几个链式储存结构介绍
- 数据结构_线性表
- 深入分析 Linux 内核链表
- 第03话:线性表的顺序存储结构
- 第02话:线性表的抽象数据类型ADT定义
- 第01话:线性表的概念与定义
- 线性表-顺序表-数据结构java版
- 大学数据结构(c++版) 王红梅版 疑惑——第二章