仅供个人学习记录使用,欢迎指正!!!!!!!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct LinkList { //约瑟夫问题 定义一个结构体
int num;
LinkList* next;
};
struct LinkList* create(int len) { /定义一个函数用于创建指定长度的链表
LinkList* head=(struct LinkList*)malloc(sizeof(struct LinkList)), * p2=head ;//注意头指针
for (int i = 0; i < len; i++) {
LinkList* p1;
p1=(struct LinkList*)malloc(sizeof(struct LinkList));
p1->num = i + 1;
p2->next = p1;
p2 = p1;
//printf("%d b\n", p1->num);test
}
p2->next = head->next;
return head;
}
LinkList* Ldelete(LinkList* head, int index) { //定义一个函数删除指定位置的结点
LinkList* move;
move= head;
LinkList* de;
for (int i=0; i < index - 1; i++) {
move = move->next;
}
de = move->next;
//printf("de:%d\\\n", de->num);
move->next = de->next;
delete de;
return move;
}
LinkList* death(LinkList* head, int len, int die) {
//返回头节点,此时头节点后只有一位最后没死的节点
LinkList* temp1 = NULL, * temp2 = NULL,*newhead=NULL;
temp2 = head;
temp1 = head;
int u = 0;
for (int t = 0; t < len - 1; t++){ //7遍
for (u = 1; u < die+1 ; u++ ) {//三个
temp1 = temp1->next;//printf("temp1: %d", temp1->num);//test
if (u == die - 1) {
temp2 = temp1; //保存被删结点的前一个结点
//printf("temp2: %d\n", temp2->num);//test
}
}
printf("die: %d\n", temp1->num);
newhead=Ldelete(temp2, 1);
temp1 = temp2;
}
//printf("head %d", head->next);
return newhead;
}
int main()
{
struct LinkList* create(int len);
LinkList* death(LinkList * head, int len, int die);
int len, index;
scanf("%d %d", &len, &index);
LinkList* list1, * rest;
list1 = create(len);
rest = death(list1, len, index);
printf("lastone %d", rest->next->num);
return 0;
}