北京理工大学2001年上机题目之四
2017-02-14 15:31
288 查看
最近再刷北京理工大学历年的上机题目,觉得还不错的题目准备记录下来,经常温习一下。
题目:N个人围成一圈顺序编号,从1开始按照1,2,3顺序报数,报三者退出圈外,依次类推,请按照退出顺序输出每个退出人的原序号。
题目要求是要用环形链表来实现。我先后用数组,单链表,环形链表实现。
1.用数组实现
2.用单链表实现
3.用环形链表来实现
参考资料:点击打开链接
备注:环形链表和单链表应该还需要改进一下,同时要明白如果报数的人数是变量呢
题目:N个人围成一圈顺序编号,从1开始按照1,2,3顺序报数,报三者退出圈外,依次类推,请按照退出顺序输出每个退出人的原序号。
题目要求是要用环形链表来实现。我先后用数组,单链表,环形链表实现。
1.用数组实现
#include<iostream> #define MAXNUM 100 using namespace std; int main(){ int a[MAXNUM]; int n; //总的人数 int m=0; //淘汰的数量 int j=0;//循环的计数器 int k=0;//用来表示报数 int i=1;//每次循环的计数器 cout<<"请输入总的人数:"; cin>>n; for(j=1;j<=n;j++){ a[j]=j; } while(m<n){ if(a[i]!=0){ k++; } if(k==3){ cout<<"\n该退出人的原序号:"<<a[i]<<endl; a[i]=0; k=0; m++; } i=i+1; if(i==n+1){ i=1; } } return 0; }
2.用单链表实现
#include<iostream> using namespace std; struct Node{ int num; Node * next; }; Node * add(Node * head,int j){ Node * node,*htemp; if(!(node = new Node)){ cout<<"分配内存失败!"<<endl; return NULL; }else{ node->num = j; node->next = NULL; if(head==NULL){ head = node; return head; } htemp = head; while(htemp->next!=NULL){ htemp = htemp->next; } htemp->next=node; return head; } } Node *findNodeNum(Node * head,int k){ Node *htemp; int i=1; htemp = head; for(i=1;i<k&&htemp;i++){ htemp = htemp->next; } return htemp; } int main(){ int n=0; //n表示总共有多少人 int m=0; //m表示需要淘汰的人数 int k=0; //k表示每次循环的报数人数 int i=1; //每轮的计数器 int l=0; //报数的变量 int j=0; //循环用的计数器 cout<<"请输入总的人数:"; cin>>n; cout<<"\n请输入淘汰的人数:"; cin>>l; Node * head = NULL; for(j=1;j<=n;j++){ head = add(head,j); } Node *nodeData; while(m<n){ nodeData = findNodeNum(head,i); if(nodeData->num!=0){ k++; } if(k==l){ cout<<"该退出人的排号是:"<<nodeData->num<<endl; nodeData->num=0; k=0; m++; } i++; if(i==n+1){ i=1; } } return 0; }
3.用环形链表来实现
#include<iostream> using namespace std; struct Node{ int num; Node * next; }; int main(){ Node * head,*p,*q; int i; int n; // 总的人数 cout<<"输入总的人数:"; cin>>n; if(!(head=new Node)){ cout<<"分配内存失败!!!"<<endl; }else{ head->num = 1; head->next = NULL; p= head; for(i=1;i<n;i++){ q = new Node; q->num = i+1; p->next = q; p = q; } p->next = head; p = head; cout<<"输出序列:"<<endl; while(p->next!=p){ q=p->next; p=q->next; q->next=p->next; cout<<p->num<<endl; delete p; p = q->next; } cout<<p->num<<endl; delete p; } return 0; }
参考资料:点击打开链接
备注:环形链表和单链表应该还需要改进一下,同时要明白如果报数的人数是变量呢
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- 快速解决C# android base-64 字符数组的无效长度问题
- C#中数组、ArrayList和List三者的区别详解
- C# 拷贝数组的几种方法(总结)
- C#动态调整数组大小的方法
- Lua中调用C++函数示例
- 详解Lua中的数组概念知识
- Lua教程(一):在C++中嵌入Lua脚本
- Perl中的列表和数组学习笔记
- Lua教程(二):C++和Lua相互传递数据示例
- jQuery 判断是否包含在数组中Array[]的方法
- 浅谈C#各种数组直接的数据复制/转换
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)