约瑟夫环

main.c


#include <iostream>
#include"list.h"
using namespace std;

int main()
{
    CirLinkList player;
    if (player.create_cirlinklist()==-1)
    {
        cout<<"create fail"<<endl;
        return 0;
    }
    player.print();
    if(player.length()==0)
    {
        cout<<"empty"<<endl;
        return 0;
    }
   Node *current=player.get_Head();
    while(player.length()>1)
    {
        player.del(current);
    }
    Node *winner=player.get_Head();
    cout<<"winner is NO."<<winner->entry<<endl;
}

list.h


#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

typedef int Node_entry; //����һ�������������������е�������

using namespace std;

const int n=8,m=3;

struct Node
{
    Node_entry entry;
    Node *next;

    Node();
    Node(Node_entry item, Node *add_on=NULL);
};

class CirLinkList
{
public:
    CirLinkList();
    ~CirLinkList();   //��̬����,���ڴ�,����Ա�����ͷ�
    int create_cirlinklist();
    int add_from_tail(Node_entry item);  //�
    void print();    //��ӡ���������нڵ�
    void del(Node* &current);  //�ӽڵ�node��ʼɾ����m���ڵ�
    Node* get(Node* node, int index); //�ӽڵ�node��ʼ���ҵ�index���ڵ�
    int length();  //��ȡ������
    Node* get_Head();  //��ȡͷָ��
private:
    Node* Head;
    Node* Tail;
    int count;
};


#endif // LIST_H_INCLUDED

list.cpp


#include <iostream>
#include"list.h"
using namespace std;

Node::Node()
{
    next=NULL;
}

Node::Node(Node_entry item, Node *add_on)
{
    entry=item;
    next=add_on;
}

CirLinkList::CirLinkList()
{
    Head=NULL;
    Tail=Head;
    count=0;
}
CirLinkList::~CirLinkList()
{
    if(Head==NULL)
    {
        cout<<"empty list"<<endl;
    }
    else
    {    Node *d=Head->next;
        while(d!=Head)
        {
            Head->next=d->next;
            delete d;
        }
        delete Head;
        Head=NULL;
    }
}

int CirLinkList::add_from_tail(Node_entry item)
{
    Node *node=new Node(item);
    if(node==NULL) return -1;
    if(Head==NULL) Head=node;
    else Tail->next=node;
    Tail=node;
    count++;
    return 0;

}

int CirLinkList::create_cirlinklist()
{
    for(int i=1;i<n+1;i++)
    {
        if (add_from_tail(i)==-1) return -1;
    }
    Tail->next=Head;
    return 0;
}

void CirLinkList::print()
{   cout<<"the member of list"<<endl;
    Node *p=Head;
    do
    {

       cout<<p->entry<<endl;
       p=p->next;

    }while(p!=Head);
}

Node* CirLinkList::get_Head()
{
    return Head;
}

int CirLinkList:: length()
{
    return count;
}


Node* CirLinkList::get(Node* node, int index)
{
    for (int j=0;j<index;j++)
        {
            node=node->next;

        }
        return node;
}

void CirLinkList::del(Node* &node)
{

        node=get(node,m-2);
        Node *temp=node->next;//delete  Node temp
        if(temp==Head) Head=temp->next;
        if(temp==Tail) Tail=node;
        node->next=temp->next;//delete  Node temp
        node=node->next;//go to next node
        count--;
        cout<<"loser is NO."<<temp->entry<<endl;
        delete temp;
        temp=NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值