约瑟夫环(改进3.0)

又改进了了一些问题

//使用循环链表来解决约瑟夫环问题
//需要对链表实现的功能:
//1. 初始化链表节点值
//2. 删掉对应元素
//3. 返回对应值和序号

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;

typedef struct LinkNode{
    int number;// 序号
	int data;// 所带密码
    struct LinkNode* next;// 指向下一个节点的指针
}LinkNode, *LinkList;// 指向结构体的指针

// 设立尾指针的单循环链表
Status ListInit_CL(LinkList &L, int given_people){
    LinkList l = (LinkList)malloc(sizeof(struct LinkNode));
    if (!l){
        exit(OVERFLOW);
    }

    L = l;// L就当作首,方便最后传出时,L没有变化

    int index;
    srand((unsigned)time(NULL));
    for (index = 1; index < given_people; index++){
        l->number = index;
        l->data =  rand() % 10 + 1;

        LinkList q = (LinkList)malloc(sizeof(struct LinkNode));// 临时存储
        if (!q) // 分配失败
            return OVERFLOW;

        // 不断新增节点
        l->next = q;
        l = q;
    }
    l->number = index;
	l->data = rand() % 10 + 1;
    l->next = L;

    return OK;
}

// 删除第i个元素,并由number返回其序号
Status ListDelete_CL(LinkList &L, int i, int &number, int &data){

    LinkList q;
    int j;
    if (i > 1){
        for (j = 1; j < i-1; j++){
        // 移动到i个节点前
            L = L->next;
        }

        q = L->next;// q指向待删除结点
        L->next = q->next;// L->next指向被删除节点的下一个
        L = L->next;
    }
    else if (i == 1){
        q = L;//q指向第一个有效位
        for (j = 0;; j++){
        // 移动到最后面,使最后指向第二个有效位,并移动过去
            L = L->next;
            if (L->next == q){
                L->next = q->next;
                L = L->next;
                break;
            }
        }
    }
    else{
        return ERROR;
    }

    //返回被删除节点序号
    //q被删除,L位于q的下一个节点上
    number = q->number;
	data = q->data;

    free(q);
    return OK;
}

int main(){
    int i, rand_num, given_people;
    printf("请输入:初始人数n,初始密码m
");
	scanf("%d %d", &given_people, &rand_num);

	if (given_people <= 0 || rand_num <= 0){
        return ERROR;
    }

    LinkList L = NULL;
    if (!ListInit_CL(L, given_people)){
        return ERROR;
    }

	int index, get_number, get_data;
    for (index = 0; index < given_people - 1; index++){
		ListDelete_CL(L, rand_num, get_number, get_data);
		printf("前一随机数-->%d,被剔除的人-->%d, 自身随机数-->%d
", rand_num, get_number, get_data);
		rand_num = get_data;
    }
    printf("==============================================
前一随机数-->%d,被剩下的人-->%d, 自身随机数-->%d
",
		   rand_num, L->number, L->data);
    return OK;
}


原文地址:https://www.cnblogs.com/lart/p/6624712.html