#include <stdio.h> #include <malloc.h> /*利用链表实现*/ typedef struct link{ int data; struct link *next; }link_s, *link_p; /*创建循环链表*/ void link_create(link_p &head, int num) { if (num < 1) { head = NULL; return; } head = (link_p)malloc(sizeof(link_s)); head->data = 1; head->next = NULL; link_p new_node = head; for (int i = 2; i < num+1; i++) { new_node->next = (link_p)malloc(sizeof(link_s)); new_node = new_node->next; new_node->data = i; new_node->next = NULL; } new_node->next = head; /*把最后一个节点指向头结点,构成循环链表*/ return; } /*打印链表,验证是否为循环链表*/ void link_print(link_p head) { int i = 0; link_p p_node = head; while (p_node && i < 100) { printf("%d->", p_node->data); p_node = p_node->next; i++; } return; } /*实现功能从1至N开始顺序循环数数,每数到M输出该数值*/ void fun_realize(link_p head, int num) { int i = 1, remove_num = 1; link_p p_node = head; link_p p_temp = NULL; while (p_node) { if (num - 1 == i) { if (p_node == p_node->next) /*剩下最后一个节点时,直接打印*/ { printf("num.%d remove %d\n", remove_num, p_node->data); free(p_node); p_node = NULL; break; } i = 1; printf("num.%d remove %d\n", remove_num, p_node->next->data); /*找到第M-1个节点,打印第M个节点*/ p_temp = p_node->next->next; /*保存第M+1个节点地址*/ free(p_node->next); /*释放第M个节点地址*/ p_node->next = p_temp; /*第M-1个节点指向第M+1个节点*/ p_node= p_node->next; /*p_node指向第M+1个节点*/ remove_num++; } else { i++; p_node = p_node->next; } } return ; } int main(void) { int n = 0, m = 0; printf("input n and m: "); scanf("%d %d", &n, &m);/*用户输入*/ getchar(); link_p lk = NULL; link_create(lk, n); fun_realize(lk, m); getchar(); return 0; }
输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出(约瑟夫环问题)
猜你喜欢
转载自blog.csdn.net/wizardtoh/article/details/44622623
今日推荐
周排行