当前位置:   article > 正文

双向链表 约瑟夫合并(C++)_双向链表的合并算法

双向链表的合并算法
  1. #include<iostream>
  2. using namespace std;
  3. class dnode{//定义节点
  4. public:
  5. int nodeValue;//该节点的值
  6. dnode *prev;//连接前后两个节点
  7. dnode *next;
  8. dnode(){
  9. next=this;
  10. prev=this;
  11. }
  12. dnode(const int &value):nodeValue(value){
  13. next=this;
  14. prev=this;
  15. }
  16. };
  17. class myList{
  18. private:
  19. dnode *first;
  20. int size;
  21. public:
  22. void push_back(int data);
  23. void pop_back();
  24. void push_front(int data);
  25. void pop_front();
  26. void insert(int pos,int data);
  27. void erase(int pos);
  28. void print();
  29. void printone(int pos);
  30. ~myList(){//析构函数
  31. dnode *p=first->next ;
  32. dnode *p1;
  33. while(p!=first){
  34. p1=p;
  35. p=p1->next ;
  36. delete p1;
  37. }
  38. }
  39. myList():first(),size(0){
  40. first=new dnode(0);
  41. first->next =first;//当只有一个哑元节点时,该节点前后的节点就是节点本身
  42. first->prev =first;
  43. }
  44. int getsize(){
  45. return size;
  46. }
  47. };
  48. //输出特定节点的值
  49. void myList::printone(int pos){
  50. dnode *p=first ;
  51. int k=0;
  52. while(k!=pos){//从前到后找到那个节点
  53. p=p->next ;
  54. k++;
  55. }
  56. cout<<p->nodeValue<<" ";
  57. }
  58. // 在最后面加入节点
  59. void myList::push_back(int data){
  60. dnode *p=new dnode(data) ;
  61. dnode *p1=first->prev ;//p1即为最后一个节点
  62. p1->next =p;//使p1 与p 连接起来
  63. p->prev =p1;
  64. p->next =first;//是 p与first连接起来
  65. first->prev =p;
  66. size++;
  67. }
  68. //删除最后一个节点
  69. void myList::pop_back(){
  70. dnode *p=first->prev;//p为最后一个节点
  71. p->prev->next =first;//使p的前一个节点与first连接
  72. first->prev =p->prev ;
  73. size--;
  74. delete p;
  75. }
  76. //在最前面插入节点
  77. void myList::push_front(int data) {
  78. dnode *p=new dnode(data);
  79. p->prev =first;//使P的前一个节点为first
  80. p->next =first->next ;//使P的后一个节点为原本的第一个
  81. first->next->prev =p;//使first 与 p节点相连
  82. first->next =p;
  83. size++;
  84. }
  85. //删除最前面的那个节点
  86. void myList::pop_front(){
  87. dnode *p=first->next ;//找到最前面的那个节点p
  88. first->next=p->next ;//使first后的节点变为原本的第二个
  89. p->next->prev=first;//使原本第二个节点与first 相连(即变为第一个节点)
  90. size--;
  91. delete p;
  92. }
  93. //删除特定节点
  94. void myList::erase(int pos){
  95. int i=0;
  96. dnode *p=first;
  97. while(i!=pos){//找到特定的节点
  98. p=p->next ;
  99. i++;
  100. }
  101. //使该节点的前一个节点 与 后一个节点相连
  102. p->prev->next =p->next ;
  103. p->next->prev =p->prev ;
  104. size--;
  105. delete p;
  106. }
  107. //在pos 的位置 插入一个节点
  108. void myList::insert(int pos,int data) {
  109. int i=0;
  110. dnode *p1=new dnode(data);
  111. dnode *p=first;
  112. while(i!=pos){//找到pos位置的节点
  113. p=p->next ;
  114. i++;
  115. }
  116. p1->prev =p->prev ;//将要插入的节点 前面连接好
  117. p->prev->next =p1;//将要插入的节点 后面连接好
  118. p->prev =p1;
  119. p1->next =p;
  120. size++;
  121. }
  122. //输出每个节点的值
  123. void myList::print() {
  124. dnode *p=first->next ;
  125. while(p->next!=first){//一个个往后输出
  126. cout<<p->nodeValue <<" ";
  127. p=p->next ;
  128. }
  129. cout<<p->nodeValue <<endl;
  130. }
  131. //约瑟夫问题 找到最后出局的那个人
  132. void findlastone(int n,int m){
  133. myList l2;
  134. int k=0;
  135. while(k!=n){
  136. k++;
  137. l2.push_back(k);//将序号作为值加入链表中
  138. }
  139. int x=1;
  140. int pos=1;
  141. while(l2.getsize() !=1){//当只剩一个人时不再进行
  142. int s=l2.getsize() ;
  143. pos++;//一个个报数
  144. x++;//一个个报数
  145. if(pos==s+1 )pos=1;//已经报完一轮 又要再从第一个开始
  146. if(x==m){//报到那个数了
  147. x=0;
  148. l2.printone(pos);//将出局的序号输出
  149. cout<<"出局"<<endl;
  150. l2.erase(pos) ;//将给节点删除 即不再参与报数
  151. pos=pos-1;//退回前一个节点 再开始报数
  152. }
  153. }
  154. l2.printone(1);
  155. cout<<"这个人活到最后"<<endl;
  156. }
  157. int main(){
  158. /*
  159. //测试双向链表的各个功能
  160. myList l1;
  161. l1.push_back(12);l1.push_back(13) ;l1.push_back(14);l1.push_back(15);
  162. l1.print() ; //输出 12 13 14 15
  163. l1.pop_back();l1.print() ;//输出 12 13 14
  164. l1.push_front(11);l1.print() ;//输出 11 12 13 14
  165. l1.pop_front();l1.print() ;//输出 12 13 14
  166. l1.insert(1,11) ;l1.print() ;//输出11 12 13 14
  167. l1.erase(1) ;l1.print() ;*/// 输出 12 13 14
  168. int n,m;//n为总共的人数 m为报的号
  169. while(cin>>n>>m)
  170. findlastone(n,m);
  171. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/905237
推荐阅读
相关标签
  

闽ICP备14008679号