循环链表的实现

1.C_Node.h文件

#ifndef C_NODE_H
#define C_Node_H

//节点类

#include <iostream>
#include <cstdio>
using namespace std;
class CList;
class CNode
{
    friend class CList;
    public:
       CNode(int data=0,CNode *p=NULL);
       ~CNode(){}
    private:
       int data;
       CNode *link;
};

CNode::CNode(int i,CNode *p)
{
    data=i;
    link=p;
}
#endif

2.C_List.h文件

//循环链表类

#ifndef C_LIST_H
#define C_LIST_H

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

class CList
{
    public:
       CList(int n);        //构造函数 
       ~CList(){}
       void Add(int i);           //尾插法添加节点 
       void Delete(int i);        //删除第i个节点     
       int Josephus(int m,int k); //约瑟夫环   
       void show(); 
    private:
       CNode *first;
};

//构造函数、不带头节点、初始化n个节点、 
CList::CList(int n)
{
    first=NULL;          
    CNode *q;
    int i=1; 
    while(n--)
    {   
        CNode *p = new CNode(i++);
        if(first==NULL)
       {
           first=p;
           q=p;
       }
       else
       {
           q->link=p;
           q=p;
       }
    }
    q->link=first;
}

//尾插法添加值i节点 
void CList::Add(int i)  //添加i个成员 
{
    CNode *p;
    while(p->link!=first)
    {
        p=p->link;
    }
    CNode *q = new CNode(i);
    p->link=q;
    q->link=first;
}

//删除第k个节点 
void CList::Delete(int k)
{
    int i=1;
    if(first==NULL) {cout<<"error"<<endl;return;}
    CNode *p=first;
    while(i<k)
       p=p->link;
    CNode *q=first;
    while(q->link!=p)
       q=q->link;
    if(q->link!=p->link)   
    {
       q->link=p->link;
       delete p;
    }   
    else
    {
        first=NULL;
        delete p;
    }
}

int CList::Josephus(int m,int k)
{
    CNode *p=first;
    while(m-->1)
    {
        int aCircleVar=1;
        while(aCircle++<k)
        {
            p=p->link;
        }
        CNode *q=first;
        while(q->link!=p)  q=q->link;
        q->link=p->link;
        p=q->link;   
    }
    cout<<"the final one is:"<<p->data<<endl;
}
#endif

void CList::show()
{
    CNode* p=first;
    while(p->link!=first)
    {
        cout<<p->data<<' ';
        p=p->link;  
    }   
    cout<<p->data<<endl;
}

3.test.cpp文件

//测试文件

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

int main()
{
    CList *CL = new CList(10);
    CL->Josephus(10,3);
}

文本结果
the final one is:4

<1>做了一个原始版的约瑟夫环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值