用的是考研数据结构所学的链表结构体+链表相关算法
天津大学2000年程序设计题:
题目:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止
#include <bits/stdc++.h>
using namespace std;
typedef struct LNode{
int count;//序号
int data;//密码
struct LNode *next;
}LNode,*LinkList;
LinkList create(int n)//尾插法创建循环单链表
{
LinkList L = NULL;
LinkList r = L;
int x;
cin>>x;
int i=1;
while(n>0)
{
LinkList s = (LinkList)malloc(sizeof(LNode));
s->count=i++;
s->data=x;
s->next=NULL;
if(L==NULL)
{
L=s;
r=s;
}
else{
r->next=s;
r=s;
}
if(n==1)
break;
cin>>x;
n--;
}
r->next=L;
return L;
}
void func(LinkList L,int m)
{
LinkList p=L;
while(p->next!=L)
p=p->next;
int res;
if(p->next!=p)//第一次报数是题目给定的m
{
while(--m)
p=p->next;
LinkList r=p->next;
cout<<r->count<<" ";
res=r->data;
p->next=r->next;
free(r);
}
while(p->next!=p)//后续报数每次都是出列者的密码
{
int mima=res;
while(--res)
p=p->next;
LinkList r=p->next;
cout<<r->count<<" ";
res=r->data;
p->next=r->next;
free(r);
}
cout<<p->count;//输出最后一个结点
free(p);
}
int main ()
{
int n,m;
cout<<"输入人数:";
cin>>n;
cout<<"输入每个人的密码:";
LinkList L=create(n);
cout<<"输入第一次报数上限值:";
cin>>m;
cout<<"出队序列:";
func(L,m);
}
7577

被折叠的 条评论
为什么被折叠?



