数据结构真是不好写啊,这一个东西看着简单,却着实让我费了点儿功夫。。不停的Debug。。唉,还是写得少了吧。加油。
#include<iostream>
using namespace std;
typedef struct node
{
int id;//delete()返回的是这个值。
int password;
struct node *next;
}People;
typedef int ElemType;
typedef struct
{
//int list_size;
int length;
int *id;
}OutList;
bool init_list(People *&List,int &m,int &n);
bool out_of_list(People *list,OutList &outlist,int m,int n);
ElemType delete_node(People *list,int i,int n);//删除循环链表的第i个
int main()
{
//生成链表。
People *LinkList=new People;
LinkList->next=NULL;
People *temp=LinkList;
//cout<<temp<<endl<<LinkList;
int m,n;
init_list(LinkList,m,n);
LinkList->next=temp;
LinkList=temp;
//测试
/*for (int i=1;i<=11;++i)
{
cout<<LinkList->id;
LinkList=LinkList->next;
}
LinkList=temp;*/
//生成线性表。
OutList outlist;
outlist.length=n;
outlist.id=new int[outlist.length];
//出列并保存出列顺序。
out_of_list(LinkList,outlist,m,n);
cout<<"出列顺序:"<<endl;
for (int i=0;i<outlist.length;++i)
{
cout<<outlist.id[i]<<"\t";
}
cout<<endl;
delete []outlist.id;
system("pause");
return 1;
}
bool init_list(People *&List,int &m,int &n)
{
People *temp=List;
while(1)
{
cout<<"输入人数:"<<endl;
cin>>n;
if(n<=30)
break;
}
cout<<"报数的初始上限:"<<endl;
cin>>m;
int i=1;
while(1)
{
cout<<"输入第"<<i<<"个人的密码:"<<endl;
cin>>List->password;
List->id=i;
++i;
if(i>n)
{
//List->next=temp;
break;
}
List->next=new People;
if(!List->next)
exit(0);
List=List->next;
}
return true;
}
bool out_of_list(People *list,OutList &outlist,int m,int n)
{
People *pTemp=list;
int i=0;
//当只剩下一个人,也就是next是自身的时候退出。
while(list->next!=list)
{
//使list指向第m个人的前一个,
if(1==m)
m=n+1;
while(m-2)
{
list=list->next;
m--;
}
//获得第m个人的id
int temp=list->next->id;
outlist.id[i]=temp;
i++;
//删除第m个人
People *plistTemp=list->next;
m=plistTemp->password;
list->next=plistTemp->next;
delete plistTemp;
//使list指向下一个人。
list=list->next;
//将这个人的数字当做新的m。
//m=list->password;
}
//删除最后一个人
outlist.id[i]=list->id;
delete list;
return true;
}
//ElemType delete_node(People *list,int m,int n)
//{
// //People *temp=list;
// //int j=0;
//
// return temp;
// //temp=list;
//}
测试数据:
m=20,n=7
password:
3,1,7,2,4,8,4
出列顺序:
6,1,4,7,2,3,5