约瑟夫问题循环链表实现

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

typedef struct Node

{

int data;

struct Node * pNext;

}NODE,* PNODE;

PNODE create_list(void)

{

int i;

int len;

printf("请输入总人数:");

scanf("%d",&len);

PNODE pHead=(PNODE)malloc(sizeof(NODE));

if(pHead==NULL)

{

printf("动态分配失败!");

exit(-1);

}

pHead->pNext=pHead;

PNODE pTial=pHead;

for(i=1;i<=len;i++)

{

PNODE pNew=(PNODE)malloc(sizeof(NODE));

if(pNew==NULL)

{

printf("动态分配失败!");

exit(-1);

}

pNew->data=i;

pNew->pNext=pTial->pNext;

pTial->pNext=pNew;

pTial=pNew;

}

return pHead;

}

void treavese_list(PNODE pHead)

{

PNODE p;

p=pHead->pNext;

while(p!=pHead)

{

printf("%d  ",p->data);

p=p->pNext;

}

printf("\n");

return;

}

void search_list(int n,int s,int m)

{

int i,j,k;

PNODE q,r,Head;

if(n<s)

{

printf("查找失败!\n");

return;

}

Head=create_list();

treavese_list(Head);

printf("\n");

printf("\n");

q=Head;

for(k=1;k<s;k++)

{

q=q->pNext;

}

for(i=1;i<n;i++)

{

for(j=1;j<m;j++)

{

q=q->pNext;

if(q==Head)

{

q=q->pNext;

}

}

if(q->pNext==Head)

{

q=Head;

}

r=q->pNext;

printf("%d\n",r->data);

q->pNext=r->pNext;

free(r);

}

printf("%d\n",Head->pNext->data);

}

int main()

{

int n,s,m;

PNODE r;

printf("Intput n, s and m:");

scanf("%d%d%d",&n,&s,&m);

search_list(n,s,m);

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 06:49:12

约瑟夫问题循环链表实现的相关文章

约瑟夫问题--循环链表实现

问题描述: n 个人围成一个圆圈, 首先第 1 个人从 1 开始一个人一个人的顺时针报数,报到第 报到第 m 个人, 令其出列. 然后再从下一 个人开始从 1 顺时针报数 , 报到第 m 个人, 再令其出列,如此下去 , 求出列顺序. 头文件: #ifndef _CIRCLE_H_ #define _CIRCLE_H_ //采用数据封装的方式,防止在主函数修改其中的属性值(有点点像面向对象中的私有属性) typedef void CircleList; typedef struct Circle

约瑟夫环----循环链表问题

我们构造一个循环链表来表示排成圆圈的人.每个人的链接指向圆圈内在他左边的人.正数i表示圆圈内的第i个人.已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解. 一道算法面试题如下: 约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁? 如

约瑟夫环(循环链表)

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列:他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列:依次重复下去,直到圆桌上剩余一个人. #include <iostream> using namespace std; struct person { int number; person *next; }; person* initLink(

约瑟夫问题(循环链表的应用)

问题描述: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过k-1个人,并杀掉第k个人.这个过程

数据结构之约瑟夫问题(循环链表)(C++版)

#include <iostream>#include <stdlib.h>using namespace std; typedef char ElemType;typedef struct LNode{ ElemType data; //数据域 struct LNode *next; //指针域}LNode, *SLink; void InitList(SLink &L){ SLink p, r; int n, j; cout << "请输入单链表元

约瑟夫问题——循环链表

在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过k-1个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着.

循环链表设计与API实现

基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素 新增功能:游标的定义 在循环链表中可以定义一个"当前"指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素. 循环链表新操作 将游标重置指向链表中的第一个数据元素 CircleListNode* CircleList_Reset(CircleList

4--循环链表

1.基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作: 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素 游标的定义 在循环链表中可以定义一个"当前"指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素. 循环链表新操作: 获取当前游标指向的数据元素 将游标重置指向链表中的第一个数据元素 将游标移动指向到链表中的下一个数据元素 直接指定删除链表中的

数据结构:线性表

线性表设计与实现 线性表基本概念 线性表定义 线性表(List)是零个或多个数据元素的集合 线性表中的数据元素之间是有顺序的 线性表中的数据元素个数是有限的 线性表中的数据元素的类型必须相同 数学定义 线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列(a1, a2, -, an)ai是表项,n 是表长度. 性质 a0为线性表的第一个元素,只有一个后继 an为线性表的最后一个元素,只有一个前驱 除a0和an外的其它元素ai,既有前驱,又有后继线性表能够逐项访问和顺序存取 练习 下面的关系