C++单链表实现

#include<iostream>
using namespace std;
template <class T>
struct SLNode
{
    T Data;///数据域
    SLNode<T> * next;///指针域
    SLNode():next(NULL) {} ///构造函数
    SLNode(const T& item):Data(item),next(NULL) {}
};
template <class T>
class SLList
{
private:
    SLNode<T> * head;///表头指针
    SLNode<T> * currptr;///当前位置指针
    int length;
public:
    SLList(void);///构造函数,构造只有一个哨位结点的空表
    SLList(const T&);///构造函数
    ~SLList(void);///析构函数
    bool IsEmpty(void)const///const函数不能修改其数据成员
    {
        return head->next==NULL;   ///判空
    }
    int GetLength(void)const
    {
        return length;
    };///返回表的长度
    bool Find(int ,T&);///存取
    int Search(const T&);///查找
    bool Delete(int);///删除:按下标删除
    bool Insert(int,const T&);///插入
    void Print(void);///打印
};
///构造函数
template <class T>
SLList<T>::SLList()
{
    head=currptr=new SLNode<T>();///创建哨位结点
    length=0;
}
template <class T>
SLList<T>::SLList(const T& item)
{
    currptr=new SLNode<T>(item);///生成一个表结点
    head=new SLNode<T>();///生成哨位结点
    head->next=currptr;
    length=1;
}
///析构函数
template <class T>
SLList<T>::~SLList()
{
    while(IsEmpty())
    {
        currptr=head->next;
        head->next=currptr->next;
        delete currptr;
    }
    delete head;
}
///存取
template <class T>
bool SLList<T>::Find(int k,T& item)
{
    if(k<0||k>length-1||IsEmpty())
    {
        return false;
    }

    currptr=head;
    for(int i=0; i<k; ++i)
    {
        currptr=currptr->next;
    }
    item=currptr->Data;
    return true;

}

///查找
template <class T>
int SLList<T>::Search(const T& item)
{
    currptr=head;
    for(int i=0; i<length; ++i)
    {
        if(currptr->Data==item)
        {
            return i;
        }
        else
        {
            currptr=currptr->next;
        }
    }
    return -1;
}

///删除:删除第k个元素,成功返回true,否则返回false
template <class T>
bool SLList<T>::Delete(int k)
{
    if(k<0||k>length-1||IsEmpty())
        return false;

    currptr=head;
    for(int i=0; i<k-1; ++i)
    {
        currptr=currptr->next;
    }
    SLNode<T> *temp;
    temp=currptr->next;
    currptr->next=temp->next;
    delete temp;
    length--;
    return true;

}

///插入:在第k个借点后插入一个值为item的节点
template <class T>
bool SLList<T>::Insert(int k,const T& item)
{
    if(k<0||k>length)
    {
        cout<<"please input right position!"<<endl;
        return false;
    }
    SLNode<T> * temp=new SLNode<T>(item);
    currptr=head;
    for(int i=0; i<k; i++)
    {
        currptr=currptr->next;
    }

    temp->next=currptr->next;
    currptr->next=temp;
    length++;
}

///打印
template <class T>
void SLList<T>::Print()
{
    currptr=head->next;
    for(int i=0; i<length; ++i)
    {
        cout<<currptr->Data<<"->";
        currptr=currptr->next;
    }
    cout<<endl;
    return;
}

///实例
int main()
{
    SLList<int> list(1);
    list.Print();
    ///尾插,尾结点为第length个结点,在length结点后插
    for(int i=5; i<=8; ++i)
    {
        list.Insert(list.GetLength(),i);
    }
    list.Print();
    ///头插,哨位结点为0结点,在0结点后插
    for(int i=2; i<=4; ++i)
    {
        list.Insert(0,i);
    }
    list.Print();
    ///任意插:在中间结点后插入0
    list.Insert(list.GetLength()/2,0);
    list.Print();
    ///存取:将结点位置为3的data取出
    int num;
    list.Find(3,num);
    cout<<"NUM3:>>"<<num<<endl;
    ///查询:查询data为0的结点位置
    num=0;
    cout<<"POS0:>>"<<list.Search(num)<<endl;
    ///删除第一个结点,哨位结点为第0个结点
    list.Delete(1);
    list.Print();
    return 0;

}

  

posted @ 2019-02-21 00:55  大大维  阅读(192)  评论(0编辑  收藏  举报