
目标考研院校的常考试题,来写一写:
- 使用一个带头节点的循环链表去解决
- 且,此头结点不固定指向某一个节点,
- 因为从题目中得,每删除一个节点,即从其下一个节点开始计数。
- 故,这里是的头结点指向每一个被删除元素的下一个元素
- 好像也没什么别的点。写就完事了,具体操作看代码注释。写的挺多的
- 头文件的话,在前面几篇博客里可找到。
#include "DataStructure.h"
#include <iostream>
typedef struct JosephCircle {
int No;
unsigned int Pwd;
struct JosephCircle* next;
}Node, * LinkList;
LinkList InitJC(int n){
LinkList L = (LinkList)malloc(sizeof(Node));
LinkList result = L;
LinkList head = NULL;
L->next = NULL;
L->No = 0;
L->Pwd = n;
printf("开始准备长度为%d的,Joseph Circle,请输入每个密码,按回车完成\n", L->Pwd);
for (int i = 0; i < n; i++)
{
LinkList p= (LinkList)malloc(sizeof(Node));
if (i==0)
{
head = p;
}
p->No = i + 1;
scanf("%d", &(p->Pwd));
L->next = p;
L = L->next;
L->next = NULL;
}
L->next = head;
printf("Joseph Circle 初始化完成\n");
return result;
}
int RmNode(LinkList& L, int n) {
int length = L->Pwd;
LinkList p = L;
int pwd,no= 0;
if (length==1)
{
pwd = L->next->Pwd;
no = L->next->No;
L->next = NULL;
L->Pwd = 0;
cout << "此时出队元素序号为\t" << no << "\t其密码值为\t" << pwd;
return pwd;
}
int BeforNeedRm = n > length ? n % length - 1 : n-1;
if (BeforNeedRm==0)
{
BeforNeedRm = length ;
}
while (BeforNeedRm--)
{
L = L->next;
}
pwd = L->next->Pwd;
no = L->next->No;
L->next = L->next->next;
p->next = L->next;
p->Pwd = length - 1;
p->No = 0;
L = p;
cout << "此时出队元素序号为\t" << no << "\t其密码值为\t" << pwd;
return pwd;
}
Status display(LinkList L) {
if (L->next==NULL||L->Pwd==0)
{
return ERROR;
}
else {
LinkList p = L->next;
L = L->next;
cout << "\t此时队伍序号为\t";
do
{
cout <<L->No;
L = L->next;
} while (p != L);
}
cout << endl;
}
int main() {
int num,m = 0;
cout << "请输入参赛人数个数" << endl;
cin >> num;
LinkList L = InitJC(num);
cout << "请输入第一个m" << endl;
cin >> m;
while (L->Pwd != 0)
{
m = RmNode(L,m);
display(L);
}
cout << "\n游戏结束 ,祝你一战成硕。嘻嘻嘻" << endl;
}
