zoukankan      html  css  js  c++  java
  • 基于循环链表的约瑟夫问题

    #pragma once
    #include<iostream>
    using namespace std;
    template<class T>
    class LinkNode //一个结构体对外全部可见
    {
    public:
    	T data; //模板类型的一个数据
    	LinkNode<T>* link; //该struct的一个指针,用于指向下一个结点
    public:
    	LinkNode(LinkNode<T>* ptr = NULL)//只初始化指针的构造函数,并使指针域为空
    	{ link=ptr;} 
    	LinkNode(const T& item,LinkNode<T>* ptr = NULL)//数据与指针一同初始化的构造函数,依旧指针域默认参数为空
    	{ data=item; link=ptr;}
    	~LinkNode(){}
    };
    #include<iostream>
    #include"LinkNode.h"
    using namespace std;
    template<class T>
    class PRO
    {
    protected:
    	LinkNode<T> *first;
    	int total_num;//约瑟夫问题总人数
    	int flag_num;//标志数字
    public:
    	PRO(int totalnum,int flagnum);
    	~PRO();
    	void print();
    };
    template<class T>
    PRO<T>::PRO(int totalnum,int flagnum)//初始化问题参数
    {
    	total_num = totalnum;
    	flag_num = flagnum;
    
    	LinkNode<T> *newNode;
    	LinkNode<T> *last;//尾结点指针标志
    	T value;
    	//makeEmpty();//销毁表
    	cin>>value;
    	first = new LinkNode<T>(value);
    	last = first;
    	int count=0;
    	while(count < total_num-1)//输入元素个数控制
    	{
    		cin>>value;
    		newNode = new LinkNode<T>(value);
    		if(newNode == NULL)
    		{
    			cout<<"内存分配错误"<<endl;
    			exit(1);
    		}
    		last->link = newNode;
    		last = newNode;
    
    		count++;
    	}
    	last->link = first;//先按照顺序的链表开辟最后首尾相连
    }
    
    template<class T>
    PRO<T>::~PRO()
    {}
    
    template<class T>
    void PRO<T>::print()
    {
    	LinkNode<T> * del;//记录待出局者
    	LinkNode<T> *current = first;//头指针的一个副本
    	while(/*current->link != current*/ total_num > 1)//当条件成立之时,链表中只剩下一个人了,此为幸存者
    	{
    		for(int k=1;k<flag_num-1 ;k++)//每一次小循环控制
    			current = current->link;
    
    		del = current->link;//当前指针指向待出局者的上一位,再把待出局者指针赋给del
    		current->link = del->link;
    		cout<<"#"<<del->data<<endl;
    		delete del;//踢出局
    
    		total_num--;//总人数变化
    		current = current->link;//把当前指针下移一位,继续大循环,为小循环初始条件
    	}
    	cout<<"最后幸存者:"<<current->data<<endl;//输出当前指针指向的幸存者
    }
    #include"Josephus_pro.h"
    #include<iostream>
    using namespace std;
    void main()
    {
    	PRO<int> p(10,8);
    	p.print();
    }
  • 相关阅读:
    导航栏的修改
    [题解](背包)luogu_P4095 eden的新背包问题
    [題解](貪心/堆)luogu_P2107小Z的AK計劃
    [題解](最短路)luogu_P2384最短路
    [題解](單調隊列dp)luogu_P1725琪露諾
    [題解](單調隊列/水)luogu_P3088擠奶牛
    [題解](單調隊列dp)【2016noip福建夏令營】探險
    [題解](水/最短路)出题人大战工作人员
    [题解](最短路)最短路点数
    [題解]luogu_P1613跑路(最短路/倍增)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3108937.html
Copyright © 2011-2022 走看看