原题链接:[编程入门]链表之报数问题
约瑟夫环问题。用循环链表解决。(也可以直接用公式法递推)
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复