您的位置:首页 > 编程语言 > C语言/C++

北京理工大学2001年上机题目之四

2017-02-14 15:31 288 查看
最近再刷北京理工大学历年的上机题目,觉得还不错的题目准备记录下来,经常温习一下。

题目: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++ 单链表 数组