约瑟夫环的实现
#include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node { datatype data; struct node *next; }linklist,*linklist_p; linklist_p create_linked(); int insert_head(linklist_p L,datatype value); void show_list(linklist_p L); int del_head(linklist_p L); int insert_order(linklist_p L,datatype value); int del_order(linklist_p L,datatype value); void joseph_game(linklist_p L,datatype k,datatype m); int main(int argc, const char *argv[]) { linklist_p L = create_linked(); if(NULL == L) { printf("函数调用失败\n"); return -1; } //insert_order(L,2); //insert_order(L,3); //insert_order(L,4); //show_list(L); del_order(L,4); insert_head(L,8); insert_head(L,7); insert_head(L,6); insert_head(L,5); insert_head(L,4); insert_head(L,3); insert_head(L,2); show_list(L); joseph_game(L,3,4); return 0; } linklist_p create_linked() { linklist_p L =(linklist_p) malloc(sizeof(linklist)); if(NULL == L) { printf("内存开辟失败\n"); return NULL; } L->next = L; L->data = 1; return L; } int insert_head(linklist_p L,datatype value) { linklist_p p = (linklist_p)malloc(sizeof(linklist)); if(p == NULL) { printf("内存开辟失败\n"); return -1; } p->next = L->next; L->next = p; p->data = value; return 0; } void show_list(linklist_p L) { linklist_p p = L; while(p->next != L) { printf("%d",p->data); p = p->next; } printf("%d\n",p->data); } int del_head(linklist_p L) { if(L==NULL) { printf("链表为空\n"); return -1; } linklist_p p = L->next; L->next = p->next; free(p); p = NULL; return 0; } int insert_order(linklist_p L,datatype value) { linklist_p p =NULL, q = L; while(q->next!=L && q->next->data <= value) { q = q->next; } if((p=(linklist_p)malloc(sizeof(linklist))) == NULL) { printf("分配地址失败\n"); return -1; } p->data = value; p->next = q->next; q->next = p; return 0; } int del_order(linklist_p L,datatype value) { linklist_p p = L,q = NULL; while(p->next!=L) { if(p->next->data == value) { q = p->next; p->next = q->next; free(q); q = NULL; return 1; } p = p->next; } return 0; } //约瑟夫问题 void joseph_game(linklist_p L,datatype k,datatype m) { linklist_p p = L,q = NULL; int i,j; //本来应该循环k-1次,因为后面第二循环首次循环m-2,后续每次循环m-1,所以在第一次循环少循环一次,以弥补第二个循环的首次循环 for(i = 0; i < k-2; i++) { p = p->next; } while(p->next != p) { for(i = 0; i < m-1; i++) { p = p->next; } q = p->next; p -> next = q->next; printf("%d",q->data); free(q); q = NULL; } printf("%d\n",p->data); }