C++ 中循环链表和约瑟夫环 C++ 中循环链表和约瑟夫环是一种重要的数据结构和算法思想。循环链表是一种特殊的链表结构,它的最后一个节点指向头结点,形成一个环。约瑟夫问题是站在圈内编号从1开始的n个人,报数到m的人自动退出圈子,问最后一个剩下的编号是多少?下面我们将详细介绍循环链表和约瑟夫环的实现和算法思想。 循环链表的实现: 循环链表是一种特殊的链表结构,它的最后一个节点指向头结点,形成一个环。它的实现可以分为四个部分:初始化、插入、删除和定位寻找。 初始化部分的代码实现: ```cpp void ListInit(Node *pNode){ int item; Node *temp,*target; cout<<"输入0完成初始化"<<endl; while(1){ cin>>item; if(!item) return ; if(!(pNode)){ //当空表的时候,head==NULL pNode = new Node ; if(!(pNode)) exit(0);//未成功申请 pNode->data = item; pNode->next = pNode; } else{ for(target = pNode;target->next!=pNode;target = target->next) ; temp = new Node; if(!(temp)) exit(0); temp->data = item; temp->next = pNode; target->next = temp; } } } ``` 插入部分的代码实现: ```cpp void ListInsert(Node *pNode,int i){ Node *temp; Node *target; int item; cout<<"输入您要插入的值:"<<endl; cin>>item; if(i==1){ temp = new Node; if(!temp) exit(0); temp->data = item; for(target=pNode;target->next != pNode;target = target->next) ; temp->next = pNode; target->next = temp; pNode = temp; } else{ target = pNode; for (int j=1;j<i-1;++j) target = target->next; temp = new Node; if(!temp) exit(0); temp->data = item; temp->next = target->next; target->next = temp; } } ``` 删除部分的代码实现: ```cpp void ListDelete(Node *pNode,int i){ Node *target,*temp; if(i==1){ for(target=pNode;target->next!=pNode;target=target->next) ; temp = pNode;//保存一下要删除的首节点 ,一会便于释放 pNode = pNode->next; target->next = pNode; delete temp; } else{ target = pNode; for(int j=1;j<i-1;++j) target = target->next; temp = target->next;//要释放的node target->next = target->next->next; delete temp; } } ``` 定位寻找部分的代码实现: ```cpp int ListSearch(Node *pNode,int elem){ Node *target; int i=1; for(target = pNode;target->data!=elem && target->next!= pNode;++i) target = target->next; if(target->next == pNode && target->data!=elem) return 0; else return i; } ``` 约瑟夫问题: 约瑟夫问题是一个经典的算法问题,它的思想是站在圈内编号从1开始的n个人,报数到m的人自动退出圈子,问最后一个剩下的编号是多少?约瑟夫问题的解法可以使用循环链表来实现。下面是一个简单的实现: ```cpp int Josephus(int n,int m){ Node *pNode = new Node; pNode->data = 1; pNode->next = pNode; for(int i=2;i<=n;++i){ Node *temp = new Node; temp->data = i; temp->next = pNode; for(Node *target = pNode;target->next!=pNode;target = target->next) ; target->next = temp; } Node *target = pNode; int count = 1; while(target->next!=pNode){ if(count==m){ Node *temp = target->next; target->next = target->next->next; delete temp; count = 1; } else{ target = target->next; count++; } } return target->data; } ``` 循环链表和约瑟夫环是一种重要的数据结构和算法思想,它们在实际应用中有着广泛的应用。了解循环链表和约瑟夫环的实现和算法思想,对于提高编程能力和解决实际问题具有重要的意义。













- 粉丝: 11
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 计算机网络管理及相关安全技术分析(1)(1).docx
- 基于民政大数据的智慧居家养老服务平台的构建研究(1).docx
- Nginx学习技术笔记(1).docx
- 人工智能时代企业财务会计的转型发展路径探讨(1).docx
- 通信工程图例大全(1).doc
- ERP在企业管理信息化建设中的运用研究(1).docx
- 软件工程练习题(1).doc
- 计算机专业求职信13篇(1).doc
- 计算机组装实习报告(2)(1).docx
- 互联网+时代如何提高农村初中数学教学效率(1).docx
- 游戏软件合作推广协议书范本——【标准】(1).doc
- 民办高校艺术设计专业的计算机辅助课程的创新与改革(1)(1).docx
- 物联网技术发展趋势概述(1).pptx
- 2019年计算机应用基础第四章测试答案.doc
- 会计实务:软件产品的成本核算(1)(1).doc
- 卡尔曼滤波的MATLAB实现(1).doc


