约瑟夫环(C语言单链表实现)

约瑟夫环(C语言单链表实现)

题目要求:

在这里插入图片描述

在这里插入图片描述

具体代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    int data;
    struct node *next;
} Node;

Node *circle_create(int n);
void count_off(Node *head, int n, int k, int m);

int main() {
    int n, k, m;
    scanf("%d%d%d", &n, &k, &m);
    Node *head = circle_create(n);
    count_off(head, n, k, m);
    return 0;
}

Node *circle_create(int n) {
    Node *temp, *new_node, *head;
    int i;

  
    temp = (Node *) malloc(sizeof(Node));
    head = temp;
    head->data = 1;


    for(i = 2; i <= n; i++) {
        new_node = (Node *) malloc(sizeof(Node));
        new_node->data = i;
        temp->next = new_node;
        temp = new_node;
    }


    temp->next = head;

    return head;
}
//以上代码来自计蒜客
void count_off(Node *head, int n, int k, int m) {
    int i;
    Node *p = NULL;
    Node *q = NULL;
    p = head;
 
    for(i = 1; i < k; i++){
        p = p->next;
    }
    if(m == 1){							//m = 1 是从当前p开始输出
    	for(i = 1; i < n; i++){
    		printf("%d",p->data);
    		printf(" ");
    		p = p->next;
		}
	}else{								//m != 1 是从当前p开始的m位开始输出
        while(p->next != p){
            for(i = 1; i < m; i++){
                q = p;
                p = p->next;
            }
            printf("%d", p->data);
            printf(" ");
            q->next = p->next;
            free(p);
            p = q->next;
        }
    }
    printf("%d",p->data);
    return;
}
 	q->next;
        }
    }
    printf("%d",p->data);
    return;
}



版权声明:本文为qq_44918232原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。