精华内容
下载资源
问答
  • 循环链表 约瑟夫环

    2013-05-27 22:42:45
    //约瑟夫环问题,n个人,从k个人开始报数,喊道m的人出列#include #define ERROR 0 using namespace std; typedef struct LNODE{ int data; struct LNODE *link; }LNODE,*linklist; void jos(int n,int k,int m)...
    //约瑟夫环问题,n个人,从k个人开始报数,喊道m的人出列
    #include <iostream>
    #define ERROR 0
    using namespace std;
    typedef struct LNODE{
    	int data;
    	struct LNODE *link;
    }LNODE,*linklist;
    
    void jos(int n,int k,int m)//n为总人数,k为第一个报数的人,m为出列者喊到的数
    {
    	linklist p,r,list,curr;
    
    	p=(linklist)malloc(sizeof(LNODE));
    	p->data=0;
    	p->link=p;
    	curr=p;
    	for(int i=1;i<n;i++)
    	{
    		linklist t=(linklist)malloc(sizeof(LNODE));
    		t->data=i;
    		t->link=curr->link;
    		curr->link=t;
    		curr=curr->link;
    		//cout<<t->data;
    	}
    	//r=curr;
    	r=p;
    	//cout<<r->data<<endl;
    
    	while((k--)!=1) {r=p;p=p->link;
    	//cout<<p->data<<endl;
    	};
    	
        //cout<<p->data<<endl;
    	while(n--){
    		//for(int s=m-1;s--;r=p,p=p->link);
    		int s=m-1;
    		while(s!=0){
    			s--;
    			r=p;
    			p=p->link;
    		}
    
    		r->link=p->link;
    	    cout<<p->data<<"->";
    		free(p);
    		p=r->link;
    	}
    }
    main()
    {
    int a,b,c;
    cout<<"the number of people is"<<endl;
    cin>>a;
    cout<<"the first man is "<<endl;
    cin>>b;
    cout<<"the num of k is"<<endl;
    cin>>c;	
    jos(a,b,c);
    
    }
    


    展开全文
  • 这是用数组表示循环链表,解决约瑟夫环的问题。匹配的报告实验报告随后上传。
  • #include #include #include typedef struct List { int date; struct List *next; }NODE,*Node; Node create_List(int ); void traverse_List(Node); //void Joseph(Head,m,n,k);...{
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    typedef struct List
    {
    int date;
    struct List *next;
    }NODE,*Node;
    Node create_List(int );
    void traverse_List(Node);
    //void Joseph(Head,m,n,k);
    int main(void)
    {
    Node Head;
    int m,n,k;
    printf("请输入总人数:");
    scanf("%d",&n);
    /*printf("请输入第一次开始报数的位置:");
    scanf("%d",&m);
    printf("你希望第几个数的人出列:");
    scanf("%d",&k);*/
    Head=create_List(n);
    // Joseph(Head,m,n,k);
    printf("\n");
    return 0;
    }
    Node create_List(int n)
    {
    Node Head,p,s;
    int i;
    Head=NULL;//头指针为空
    p=Head;//Head为不戴表头的头指针。
    for(i=1;i<=n;i++)
    {
    s=(Node)malloc(sizeof(NODE));
    s->date=i;
    p->next=s;
    p=s;
    }
    p->next=Head;//表尾指向首节点。
    return Head;
    }
    void traverse_List(Node Head)
    {
    Node p;
    for(p=Head;p->next!=Head;p=p->next)
    {
    printf("%3d",p->date);
    }
    if(p->next==Head)
    printf("%3d",p->next);
    printf("\n");
    return ;


    }
    展开全文
  • 然后设定一个数m,从第一个小孩数起,数到第m个的时候,该小孩离开。...依次这样数下去,最后一个小孩是胜利者,问:...单循环链表天然地很适合解决这个问题,下面用C语言实现了一下:#include #include #include #de...

    一群小孩围成一圈,每个小孩都会带有一个随机的密码。然后设定一个数m,从第一个小孩数起,数到第m个的时候,该小孩离开。小孩离开时,其携带的密码将更新这个m值,顺序往下数的第m个小孩会继续出列。依次这样数下去,最后一个小孩是胜利者,问:胜利者是第几个小孩?

    这就是大家所熟知的约瑟夫环。

    单循环链表天然地很适合解决这个问题,下面用C语言实现了一下:

    #include

    #include

    #include

    #define OK 1;

    #define ERROR 0;

    #define OVERFLOW -2;

    typedef int ElemType;

    typedef struct Node

    {

    ElemType num;

    ElemType password;

    struct Node *next;

    }Node;

    typedef struct Node CLinkList; /* 定义LinkList */

    void main(){

    int num=10;

    int m=10;

    CLinkList *L;

    /* 输入约瑟夫环的总结点数*/

    printf("有多少个小孩参与游戏(设定小于100):");

    scanf("%d",&num);

    if(num<=0||num>=100){

    /* 如果输入的数字超出范围,就默认总结点数为10 */

    printf("你的输入不符合,下面采用默认数字10\n");

    num=10;

    }

    /* 输入第一个需要出列的数字 */

    printf("第一个报到哪个数必须出列 (设定小于100):");

    scanf("%d",&m);

    if(m<=0||m>=100){

    printf("你的输入不符合,下面采用默认数字10\n");

    m=10;

    }

    InitList(L);

    Creat_Joseph(L,num);

    ListTraverse(L,num);

    Joseph_Run(L,m);

    }

    /* 释放删除的结点 */

    void FreeNode(CLinkList *p){

    CLinkList *temp=p;

    while(temp->next!=p)

    temp=temp->next;

    temp->next=p->next;

    printf("编号%3d的小孩离队了,他携带的密码是%3d\n",p->num, p->password);

    free(p);

    }

    /* 初始化结点 */

    int InitList(CLinkList *l){

    l=(CLinkList *) malloc (sizeof(CLinkList));

    if(!l)

    return OVERFLOW;

    return OK;

    }

    /* 创建每个结点携带的密码 */

    void Creat_Joseph(CLinkList *l,int length){

    int i;

    CLinkList *p=l;

    l->next=l;

    l->num=1;

    srand( (unsigned)time(NULL));

    l->password=rand()%(length+3)+1;

    printf("以下小孩(约瑟夫环结点)携带的密码随机生成的:\n");

    /* 打印约瑟夫环的第一个结点 */

    printf("小孩编号: %3d 带的密码: %3d\n",l->num,l->password);

    for(i=1;i

    CLinkList* temp=(CLinkList*)malloc (sizeof(CLinkList));

    p->next=temp;

    temp->next=l;

    temp->num=i+1;

    temp->password=rand()%(2*length)+1;

    /* 打印除第一个结点外的其它结点 */

    printf("小孩编号: %3d 带的密码: %3d\n",temp->num,temp->password);

    p=p->next;

    }

    }

    void ListTraverse(CLinkList *L,int length)

    {

    int i;

    CLinkList *p=L->next;

    for(i = 0; i < length; i++)

    {

    printf("%d:%d ",p->num, p->password);

    p=p->next;

    }

    printf("\n");

    return OK;

    }

    /* 根据结点携带的密码释放下一个结点 */

    void Joseph_Run(CLinkList *l, int m){

    int i,k;

    CLinkList *temp,*p;

    if(l->next==l)

    /* 打印最后一个结点 */

    printf("最后编号 %d 的小孩获胜!",l->num);

    else{

    temp = l;

    for(i=1; i

    {

    printf("编号%3d的小孩安全\n",temp->num);

    temp=temp->next;

    }

    p=temp->next;

    k=temp->password;

    /* 释放中招的结点 */

    FreeNode(temp);

    /* 递归 */

    Joseph_Run(p,k);

    }

    }

    程序运行结果:

    有多少个小孩参与游戏(设定小于100):6

    第一个报到哪个数必须出列 (设定小于100):8

    以下小孩(约瑟夫环结点)携带的密码随机生成的:

    小孩编号: 1 带的密码: 5

    小孩编号: 2 带的密码: 9

    小孩编号: 3 带的密码: 12

    小孩编号: 4 带的密码: 2

    小孩编号: 5 带的密码: 5

    小孩编号: 6 带的密码: 2

    2:9 3:12 4:2 5:5 6:2 1:5

    编号 1的小孩安全

    编号 2的小孩安全

    编号 3的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 6的小孩安全

    编号 1的小孩安全

    编号 2的小孩离队了,他携带的密码是 9

    编号 3的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 6的小孩安全

    编号 1的小孩安全

    编号 3的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 6的小孩离队了,他携带的密码是 2

    编号 1的小孩安全

    编号 3的小孩离队了,他携带的密码是 12

    编号 4的小孩安全

    编号 5的小孩安全

    编号 1的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 1的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 1的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 1的小孩离队了,他携带的密码是 5

    编号 4的小孩安全

    编号 5的小孩安全

    编号 4的小孩安全

    编号 5的小孩安全

    编号 4的小孩离队了,他携带的密码是 2

    最后编号 5 的小孩获胜!

    Process returned 23 (0x17) execution time : 8.506 s

    Press any key to continue.

    展开全文
  • #include #include typedef struct LNode {//构造结点类型 int data; struct LNode *next; }*LinkList;...//创造一个循环链表 void OutList(LinkList &L,int m);//数到m出列,并释放该结点 void main()//主
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct LNode
    {//构造结点类型
    	int data;
    	struct LNode *next;
    }*LinkList;
    void CreateList(LinkList &L,int n);//创造一个循环链表
    void OutList(LinkList &L,int m);//数到m出列,并释放该结点
    void main()//主函数
    {	LinkList La;
    	int a,b;
    	printf("Please input the total number and the number of outside:\n");
    	scanf("%d,%d",&a,&b); 
    	CreateList(La,a);
    	OutList(La,b);	
    }
    void CreateList(LinkList &L,int n)
    {	int i;
    	LinkList p,q;
    	if(!(L=(LinkList)malloc(sizeof(LNode))))
    	{	printf("fail to create list!\n");
    		return;
    	}
    	L->next=NULL;
    	L->data=1;
    	q=L;
    	for(i=1;i<n;i++)//再建n-1个结点
    	{	p=(LinkList)malloc(sizeof(LNode));
    		printf("Please input a number:");
    		scanf("%d",&p->data);
    		p->next=q->next;
    		q->next=p;
    		q=p;
    		L->data++;
    	}
    	q->next=L;
    	printf("Success to create list!\n");
    }
    void OutList(LinkList &L,int m)
    {	int j,k;
    	k=L->data;
    	LinkList s=L,r,t;
    	while(1)
    	{	for(j=1;j!=m;j++)
    		{	r=s;
    			s=s->next;
    		}
    		printf("%d is breaking the ranks!\n",s->data);
    		t=s;
    		r->next=s->next;
    		s=s->next;
    		free(t);
    		k--;
    		if(k==1)
    		{	printf("%d is breaking the ranks!\n",s->data);
    			free(s);
    			L=NULL;
    			break;
    		}
    	}
    }
    

    展开全文
  • C语言循环链表约瑟夫环问题

    千次阅读 2013-07-09 20:50:16
    本实验最难的部分是循环链表的建立过程,其余的都只是很简单的部分,先不讲了,看代码应该会好理解的。 # include # include typedef struct node { int number; struct node *next; }Lnode,*Linklist; ...
  • 循环链表跟普通单链表的区别就在于最后一个节点是否指向第一个节点,循环链表收尾相连。 在使用节点、链表等结构时,要自己写一个Node类,成员变量包括节点的值和指针域。 约瑟夫环代码分享: import ...
  • 循环链表约瑟夫环

    2016-11-12 20:55:13
    利用循环链表约瑟夫环问题
  • 主要介绍了C++ 中循环链表约瑟夫环的相关资料,需要的朋友可以参考下
  • 主要介绍了C语言基于循环链表解决约瑟夫环问题的方法,简单描述了约瑟夫环问题并结合实例形式分析了C语言使用循环链表解决约瑟夫环问题的具体操作技巧,需要的朋友可以参考下
  • 主要介绍了C数据结构循环链表实现约瑟夫环的相关资料,需要的朋友可以参考下
  • 用C语言编写的约瑟夫环问题解决程序,利用单向循环链表存储结构模拟此过程
  • C++循环链表解决约瑟夫环问题
  • 是一道比较经典的循环链表问题,在华为上机笔试中也出现过。约瑟夫环是一个数学的应用问题,下面这篇文章主要就给大家介绍了javascript循环链表约瑟夫环的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧。
  • 循环链表实现了约瑟夫环,结果较好,这是从面试宝典里面抽出来的
  • 循环链表约瑟夫环问题
  • js单循环链表解决约瑟夫环设计链表Node类LinkedList类插入节点查找节点(find)插入节点(insert)删除节点查找前一个节点(findPrevious)删除节点(remove)链表前进幅度(advance)链表当前长度(count)解决...
  • 主要介绍了C++循环链表约瑟夫环的实现方法,对于学习数据结构与算法有一定的借鉴价值,需要的朋友可以参考下
  •  /*打印链表,并检查循环链表是不输入正确*/ for(i=1;i { for(j=1;j { r=p; p=p->next; } printf("出局人:%d\n",p->data); r->next=p->next; } } void main() { int x, z; printf("请输入总人数:"); scanf("%d",&...
  • Java循环链表实现约瑟夫环

    千次阅读 2016-10-11 21:42:07
    问题描述: 约瑟夫环运作如下: 1、一群人围在一起坐成[2] 环状(如:N) 2、从某个编号开始报数(如:K) ...使用循环链表实现约瑟夫环是一种解法,但是效率不高。 public class yuesefu { static class Node {
  • 循环链表实现约瑟夫环问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又...
  • 单向循环链表解决约瑟夫环问题 /* 这段代码的功能是使用单向循环链表来实现约瑟夫环问题 */ #include<stdio.h> #include<stdlib.h> typedef int ElemTppe; typedef struct node{ ElemTppe data; ...
  • 循环链表约瑟夫环

    2018-07-28 21:19:33
    瞅着约瑟夫环很简单的,据说用循环链表写 时间复杂度很大(喵喵喵???我也不造)然后写到了晚上,,,,,,不过循环链表真的挺好玩啊。竟然还能这样,,原谅我见识浅薄,喏,,大一大二 不写代码就拖到大三来补。...
  • 循环链表约瑟夫环

    2015-05-21 16:52:28
    循环链表约瑟夫问题
  • 循环链表 首先用Java实现循环链表及其增删改查等操作: public class CircularList<T>{ private class Node{ Node next = null; T data; public Node(T t) { this.data = t; } } pri...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,619
精华内容 647
关键字:

循环链表约瑟夫环