循环链表的一个案例-约瑟夫环

/*
 * Josephus.c
 *
 *  Created on: 2019年7月25日
 *      Author: Administrator
 */


#include "CycleLinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define M 8
#define N 3


typedef struct MYNUM {
    CircleLinkNode node;
    int val;
} MyNum;


void MyPrint(CircleLinkNode *data) {
    MyNum *num = (MyNum *)data;
    printf("num: %d ",num->val);
}

int MyCompare(CircleLinkNode *data1, CircleLinkNode *data2) {
    MyNum *num1 = (MyNum *)data1;
    MyNum *num2 = (MyNum *)data2;
    if(num1->val == num2->val){
        return CIRCLELINKLIST_TRUE;
    }
}
int main() {
    printf("约瑟夫环 问题 \n");
    //创建循环链表
    CircleLinkList *clist = Init_CircleLinkList();

    //链表插入数据
    MyNum num[M];
    for(int i = 0; i < 8; i++){
        num[i].val = i + 1;
        Insert_CircleLinkList(clist, i, (CircleLinkNode *)&num[i]);
    }
    //打印
    Print_CircleLinkList(clist, MyPrint);
    printf("\n ");
    //记录当前是第几个人
    int index = 1;
    //辅助指针
    CircleLinkNode *pCurrent = clist->head.next;
    while(Size_CircleLinkList(clist) > 1)
    {
        if(index == N) {
            MyNum *temNum = (MyNum*)pCurrent;
            printf("%d ", temNum->val);

            //缓存待删除节点的下一个节点
            CircleLinkNode *pNext = pCurrent->next;
            //根据值 删除
            RemoveByValue_CircleLinkList(clist, pCurrent, MyCompare);
            pCurrent = pNext;
            if(pCurrent == &(clist->head)){
                pCurrent = pCurrent->next;
            }
            index = 1;
        }

        pCurrent = pCurrent->next;
        if(pCurrent == &(clist->head)){
            pCurrent = pCurrent->next;
        }
        index++;
    }

    //输出最后一个元素
    if(Size_CircleLinkList(clist) == 1) {
        MyNum* tempNum = (MyNum *)Front_CircleLinkList(clist);
        printf("%d", tempNum->val);
    }else{
        printf("出错");
    }
    printf("\n ");
    //释放内存
    FreeSpace_CircleLinkList(clist);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wjw-blog/p/11324879.html