循环链表-圆桌出列问题

来源:互联网 发布:程序员怎么转ai工程师 编辑:程序博客网 时间:2024/06/05 03:56

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

以下是C++实现代码

#include <cstdlib>#include <cstdio>typedef struct LNode{    int data;    struct LNode *link;}LNode,*LinkList;

//建立无头结点的循环链表

LinkList Create( int n ){    LinkList head,p,temp;    head=NULL;    p=head;    int i;    for( i=1;i<=n;i++ ){        temp=(LinkList)malloc(sizeof(LNode));        temp->data=i;        if( head==NULL ){            head=temp;            p=head;        }else{            p->link=temp;            p=temp;        }    }    p->link=head;    return head;}

//出列函数

void function( int n,int m,int k ){    LinkList head,p,q;    head=Create(n);    int i;    printf( "the list is:\n" );    p=head;    for( i=0;i<n;i++ ){        printf( "%d ",p->data );        p=p->link;}    printf("\n");    p=head;    //找到第一个报数的结点,即编号为k的结点    for( i=0;i<n;i++ ){        if( k==p->data )            break;        p=p->link;    }    //循环数1到m,出列    while( n-- ){        for( i=1;i<m;i++ ){            q=p;            p=p->link;        }        printf( " %d out\n",p->data );        q->link=p->link;        free(p);        p=q->link;    }}

//主函数

int main(){    function(5,4,2);    return 0;}
原创粉丝点击