约瑟夫环代码

使用链表描述的约瑟夫环的问题,输入n个数构成一个循环,并设置一个间隔m,从第一个结点开始,循环淘汰第m个结点,直到剩下一个结点为止。

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

//
template<class T>
List<T>::List(List<T> &L) //复制构造函数
{
    T value;
    LinkNode<T> *srcptr = L.getHead();
    LinkNode<T> *destptr = first = new LinkNode<T>;
    while(srcptr->link != NULL)
    {
        value = srcptr->link->data;
        destptr->link = new LinkNode<T>(value);//不断创建新的LinkNode,并用value初始化
        destptr = destptr->link;
        srcptr = srcptr->link;
    }
    destptr->link = NULL;
}
//
template<class T>
void List<T>::makeEmpty()
{
    LinkNode<T> *q;
    while(first->link != NULL)
    {
        q = first->link;
        first->link = q->link;//将附加头结点后的结点摘下,只保留一个头结点
        delete q;
    }
}
//
template<class T>
int List<T>::Length()const
{
    LinkNode<T> *p = first->link;//头结点不计算长度
    int count = 0;
    while(p != NULL)
    {
        p = p->link;
        count++;
    }
}
//
template<class T>
LinkNode<T> * List<T>::Search(T x)
{
    LinkNode<T> *current = first->link;
    while(current != NULL)
    {
        if(current->data == x)
            break;
        else
            current = current->link;
    }
    return current;
}
//
template<class T>
LinkNode<T> * List<T>::Locate(int i)
{
    if(i < 0) return false;
    LinkNode<T> *current = first; int k = 0;
    while(current != NULL && k < i)  //注意使用不同的循环语句,循环跳出条件也不同
    {
        current = current->link; k++;
    }
    return current;
}
//
template<class T>
bool List<T>::getData(int i, T &x)const
{
    if(i < 0) return NULL;
    LinkNode<T> *current = Locate(i);
    if(current == NULL) return false;
    else
    {x = current->data;return true;}
}
//
template<class T>
bool List<T>::Insert(int i, T &x)
{
    LinkNode<T> *current = Locate(i);
    if(current == NULL) return false;
    LinkNode<T> *newNode = new LinkNode<T>(x);
    newNode->link = current->link;
    current->link = newNode;
    return true;
}
//
template<class T>
bool List<T>::Remove(int i, T &x)
{
    LinkNode<T> *current = Locate(i-1);
    if(current == NULL || current->link == NULL) return false;
    LinkNode<T> *del = current->link;
    current->link = del->link;
    x = del->data;delete del;
    return true;
}
//
template<class T>
void List<T>::Output()
{
    LinkNode<T> *current = first->link;
    while(current != NULL)
    {
        cout<<current->data<<endl;
        current = current->link;
    }
}
//
template<class T>
List<T>& List<T>:: operator= (List<T> &L)
{
    T value;
    LinkNode<T> *srcptr = L.getHead();
    LinkNode<T> *destptr = first = new LinkNode<T>;
    while(srcptr->link != NULL)
    {
        value = srcptr->link->data;
        destptr->link = new LinkNode<T>(value);//不断创建新的LinkNode,并用value初始化
        destptr = destptr->link;
        srcptr = srcptr->link;
    }
    destptr->link = NULL;
    return *this; //返回操作对象的地址,即新建的List对象的地址
}
//
template<class T>
void List<T>::FormInput(T endTag)
{
    LinkNode<T> *newNode; T val;
    makeEmpty();
    cin>>val;
    while(val != endTag) 
    {
        newNode = new LinkNode<T>(val);
        if(newNode == NULL){cerr<<"存储非配错误!"<<endl;exit(1);}
        newNode->link = first->link;
        first = newNode;
        cin>>val;
    }
}
//
template<class T>
void List<T>::LastInput(T endTag)
{
    LinkNode<T> *newNode,*last; T val;
    makeEmpty();
    cin>>val;last = first;
    while(val != endTag)
    {
        newNode = new LinkNode<T>(val);
        if(newNode == NULL){cerr<<"存储非配错误!"<<endl;exit(1);}
        last->link = newNode;
        last = newNode;
        cin>>val;
    }
    last->link = NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值