美文网首页
近几日比较火的一个问题?为啥呢?因为我们在学数据结构

近几日比较火的一个问题?为啥呢?因为我们在学数据结构

作者: 魂梦云边 | 来源:发表于2017-09-21 18:04 被阅读0次

    一般说来,学习数据结构,都会写一个约瑟夫环的算法?下面我就简单说说,
    对于这个规则就不细述了。

    分析:1 .首先要创建链表,创建一个循环链表?是要头结点呢? 其实都可以
    2 .整个实现过程其实就是循环链表的删除操作。但是要把握细节。废话不多说

    便于测试,我就把密码写成了随机数

    具体的细节我就写在注释里面了

    #define _CRT_SECURE_NO_WARNINGS     //预编译处理
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    typedef struct node     // 定义节点
    {
        int num;    //编号
        int pwd;    //密码
        struct node *next;
    }Node, *LinkList;
    
    
    void CreatList(LinkList &L, int n)  // 创建链表
    {
        int data;
        LinkList LNew, pCur;
    
        pCur = L;
    
        int i;
        srand((unsigned)time(NULL));
    
    
        for (i = 0; i < n; i++) {
            LNew = (LinkList)malloc(sizeof(Node));
            LNew->num = i + 1;
            LNew->pwd = (rand() % 5 + 1);
    
            pCur->next = LNew;
            pCur = LNew;
        }
    
        pCur->next = L->next;
    
        return;
    }
    
    void Print(LinkList L)  // 打印链表
    {
        if (L->next == NULL) {      //判断空链表
            printf("此链表为空!\n");
            return;
        }
    
        LinkList pCur;
        pCur = L->next;
    
        while (1) {
            printf("%-4d%-4d\n", pCur->num, pCur->pwd);
            pCur = pCur->next;
            if (pCur == L->next)
                break;
        }
        return;
    }
    
    void Game(LinkList &L, int n)
    {
        int count_All;  //计数器,用于标记当前的个数
        int count_Every;    //单次循环计数器
    
        LinkList pPre;
        LinkList FreeTemp;
    
        count_All = 0;  
        count_Every = 1;
    
        int flagPwd;    
        srand((unsigned)time(NULL));    /* 设置初始密码为随机值(1~n) */
        flagPwd = rand()%n+1;
        
        pPre = L;
        
        printf("初始密码为:flagPwd=%d\n", flagPwd);
    
        while (1) {
            if (flagPwd == count_Every) {
    
                printf("%d ", pPre->next->num);     //打印 出局者 的序号
    
                printf("%d\n", pPre->next->pwd);    // 打印 出局者 的 pwd
    
                flagPwd = pPre->next->pwd;      //重置密码 pwd 为 出局者密码
    
                FreeTemp = pPre->next;      // 记录出局者 待后续释放空间
    
                pPre->next = pPre->next->next;      //删除节点(出局者)
    
                free(FreeTemp);     //释放出局者 
    
                count_All++;    //计数 删除节点的个数
    
                count_Every = 0;    // 删除节点之后,计数为置为 0
            }
            else {
    
                pPre = pPre->next;  //游标后移
            }
    
            count_Every++;  //当前计数加 +1 
    
            if (count_All == n) {
                L->next = NULL;
                break;
            }
    
            fflush(stdin);  //清除缓存
        }
    }
    
    
    int main()      //主函数
    {
        LinkList L; // 
    
        L = (LinkList)malloc(sizeof(Node));
        L->next = NULL;     //头结点指针域为空,防止为合并之后为空的输出异常
    
        int n;  //游戏人数
        printf("请输入游戏人数:");
        scanf("%d", &n);
    
        CreatList(L, n);    //初始化游戏
        printf("游戏初始化结果:\n");
        Print(L);           //打印初始化结果
    
        printf("游戏结果:\n");  //游戏处理
        Game(L, n);
    
        //printf("结果:\n");
        //Print(L);
    
        system("pause");
    
        return 0;
    }
    
    
    
    Paste_Image.png

    相关文章

      网友评论

          本文标题:近几日比较火的一个问题?为啥呢?因为我们在学数据结构

          本文链接:https://www.haomeiwen.com/subject/uhjtextx.html