zoukankan      html  css  js  c++  java
  • 约瑟夫环(改进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;
    }
    
    
    
  • 相关阅读:
    为 HTTP/2 头压缩专门设计的 HPACK
    HTTP2 帧基础知识以及Header、CONTINUATION、DATA帧相关资料:
    扩充巴科斯-瑙尔范式 ABNF简介
    我Win下常用工具清单
    gRPC版本的 Google APIs
    gRPC 的route_guide例子
    proto3 笔记1
    编译gRPC Go版本使用的 ProtoBuffer 文件
    新浪校园招聘2013.10.30浙大玉泉4教301笔试的前端妹纸,像雾像雨又像风
    Android下Notification,样式style,主题theme的功能实现
  • 原文地址:https://www.cnblogs.com/lart/p/6624712.html
Copyright © 2011-2022 走看看