Joseph算法,

数据结构真是不好写啊,这一个东西看着简单,却着实让我费了点儿功夫。。不停的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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值