约瑟夫问题 循环链表实现和数字处理实现

来源:互联网 发布:nodejs 定义二维数组 编辑:程序博客网 时间:2024/05/22 14:04
#include<iostream>
#include<cstring> //指针初始化都是 NULL 


using namespace std;


typedef struct person
{
int data;
person *next;
}person;
person * create( int n ) //构建循环链表 
{
person *temp =NULL;  //建一个指针 
if(0!=n)        //如果不是空的 
{
int j = 1;
person * p_perso = NULL;
p_perso = new person[n]; //新开个结构指针 
if(NULL == p_perso)
{
return NULL;
}
else
{
memset(p_perso,0,sizeof(p_perso));
}
temp = p_perso;
while(j < n)  //数组的初始化 
{
p_perso -> data = j;
p_perso -> next = p_perso + 1; //既然是数组,则每一个数组需要变成下一个 
p_perso = p_perso -> next;//加 1 就是指针的地址指向数组的下一个。 
j++;
}
p_perso -> data = n;
p_perso -> next = temp;
}
return temp;
}
int main()
{
person *p = NULL;
person *r = NULL;
int all,first,loop;
cin >> all >> first >>loop;
p = create(all);         //传入指针(循环链表的指针) 
r = p;
for(int i = 0; i < first - 1;i++)
{
r = r->next;
}
while(r->data != r->next->data)
{
int i = 1;
for(;i < loop-1 ; i ++)
{
r = r -> next;
}
cout << r  -> next -> data <<" ";
r -> next = r -> next -> next; //原来的指向指向下一个 (删除操作) 

   r = r->next ;   //和删除无关,只是让指向下一个然后继续走。 

}
cout << r-> data << endl;
delete [] p;
// delete [] r;
return 0;
}
/*
#include<iostream>
using namespace std;
int main(){
    int N,M;
    cin>>N>>M;
    int* a=new int[N];
    for(int i=0;i<N;i++){
        a[i]=i+1;
    }
    int countN=0;
    int countM=0;


        for(int i=0;;i++){
            if(a[i%N]!=-1){
                countM++;
            }
            if(countM==M){
                cout<<a[i%N]<<" ";
                a[i%N]=-1;
                countN++;
                countM=0;
            }
            if(countN==N){
                break;
            }
        }
    delete a;


    return 0;
}
*/
//第二种方法:数字处理,和灭灯问题一样。然其它关了的变成-1,不是的话就+1 ;加到要求值输出 
//真傻瓜,就用了取%的操作,就每次可以自觉返回初始。 
0 0