原题链接:[编程入门]链表之报数问题
约瑟夫环问题。用循环链表解决。(也可以直接用公式法递推)
#include <bits/stdc++.h>
using namespace std;
typedef int ElementType;
struct cNode{
ElementType data;
struct cNode* Next;
};
typedef struct cNode* PtrtoCNode;
typedef PtrtoCNode CNode;
void tailinsert(ElementType data,CNode L);//尾插法建表
CNode deletenode(CNode p,CNode head);//报到的人删除
void ConnectCList(CNode head);//单链表头尾相连成循环链表
int main(){
int n;
cin >> n;
CNode head = (CNode)malloc(n*sizeof(struct cNode));
head->data = 0;
head->Next = NULL;
ElementType x;
for(int i=1;i<=n;i++){
tailinsert(i,head);
}
ConnectCList(head);
//报数过程开始
CNode p = head->Next;
while(head->data!=1){
for(int i=0;i<2;i++){
p = p->Next;
}
p = deletenode(p,head);
}
cout << head->Next->data << endl;
return 0;
}
void tailinsert(ElementType data,CNode L){
CNode node = (CNode)malloc(sizeof(node));
node->data = data;
node->Next = NULL;
if(L->data==0){
L->Next = node;
L->data++;
}
else{
CNode temp = L->Next;
while(temp->Next!=NULL){
temp = temp->Next;
}
temp->Next = node;
L->data++;
}
}
CNode deletenode(CNode p,CNode head){
CNode temp = head->Next;
CNode t;
CNode preserve;
if(p==head->Next){//要删除结点是第一个结点的情况
head->Next = p->Next;
preserve = p->Next;
p->Next = NULL;
free(p);
p = NULL;//free完记得置空
head->data--;
ConnectCList(head);
return preserve;
}
else{
while(temp->Next!=p){
temp = temp->Next;
}
temp->Next = p->Next;
preserve = p->Next;
p->Next = NULL;
free(p);
p = NULL;//free完记得置空
head->data--;
return preserve;
}
}
void ConnectCList(CNode head){
CNode temp = head;
for(int i=0;i<head->data;i++){
temp = temp->Next;
}
temp->Next = head->Next;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复