约瑟夫环(C循环链表)

来源:互联网 发布:喇叭测试软件 编辑:程序博客网 时间:2024/05/16 06:12

约瑟夫环(约瑟夫问题)是一个数学的应用问题:

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依规律重复下去,直到圆桌周围的人全部出列。


一个挺简单的循环的题,拿来初学者学链表时练手很适合


talk is cheap, show me the code



下面是代码:

#include <stdio.h>

#include <stdlib.h>


#define maxn 100           //最多100个人同时处于环中


typedef int DataType;
typedef struct Node{
    DataType data;
    struct Node *next;
}Node;


Node *CreatList(DataType a[],int n){
    Node *first = (Node*)malloc(sizeof(Node));
    first->next = NULL;
    Node *r = NULL,*p = NULL;
    r = first;


    for(int i = 0;i < n;i++){
        p = (Node*)malloc(sizeof(Node));
        p->data = a[i];
        p->next = NULL;
        r->next = p;
        r = p;
    }
    p->next = first->next; // 建立循环链表


    return first;


}


void DeleteData(Node *first,int n,int x){
    Node *p = first->next;
    Node *r;
    int ptr;
    for(int i = 1;i < n;i++)
        p = p->next;            //确定第一个退出的人的位置
    while(p->next != p){           //一直循环到链表中只剩下一个人为止,则这个人就为最后存活的那一个
    for( int i = 1;i <= x - 1;i++){
        p = p->next;            //循环找第X位淘汰的人
    }


    ptr = (p->next)->data;
    r = p->next;
    p->next = r->next;
    free(r);                    //淘汰出局
    }
    printf("%d",p->data);       //荒野逃生,绝地吃鸡(逃)
}






int main()
{
    Node* first = NULL;
    int n;
    int i,k,x = 1;
    k = 3;
                //每隔K个人便淘汰一个
    DataType Data[maxn];


    scanf("%d",&n);
    for(i = 0;i < n;i++){
        Data[i] = i + 1;
    }   
    first = CreatList(Data,n);  //创建循环链表
    DeleteData(first,n,k);         //Game Begining,开始淘汰出局


    return 0;
}