链表模板类的定义

//------------------------------------------ClassLinkList.h------------------------------------------

template <class T> class linkList;

template <class T>
class Link
{
friend class linkList<T>;
private:
        T data;                                   // 用于保存结点元素的内容
         Link<T> * next;                                  // 指向后继结点的指针
public:          
        Link(const T info,Link<T>* nextValue=NULL)
        {
            data=info;
            next=nextValue;
        }
        Link(Link<T>* nextValue)
        {
            next=nextValue;
        }
};

template <class T>
class linkList
{
private:
    Link<T> *head, *tail;                                  // 单链表的头、尾指针
    Link<T> *setPos(const int i);                          // 返回线性表指向第p个元素的指针值
public:
    linkList(int s);                                      // 构造函数
    ~linkList();                                          // 析构函数
    bool isEmpty();                                       // 判断链表是否为空
    void clear();                                           // 将链表存储的内容清除,成为空表
    int length();                                            // 返回此顺序表的当前实际长度
    bool append(const T value);                              // 在表尾添加一个元素value,表的长度增1
    bool insert(const int i, const T value);              // 在位置i上插入一个元素value,表的长度增1
    bool myDelete(const int i);                           // 删除位置i上的元素,表的长度减 1
    bool getValue(const int i, T& value);                 // 返回位置i的元素值
    bool getPos(int &i, const T value);                      // 查找值为value的元素,返回第1次出现的位置
    void output();
};

template <class T>                                        //输出链表
void linkList<T>::output()
{
    int i;
    Link<T> *p=head;
    int size=length();
    cout<<"the length of linkList is "<<size<<endl;
    for(i=0;i<size;i++)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

template <class T>                                       // 函数返回值是找到的结点指针,线性表的元素类型为T
Link<T> * linkList <T>:: setPos(int i)
{
    if(i<0||i>=length())
    {
        cout<<"错误!所要查找的位置不存在!"<<endl;
        return false;
    }
    else
    {
        if(i==0)
            return head;
        else
        {
            int count = 0;
             Link <T> *p=head;
            while (p != NULL && count <i)
            {
                 p = p-> next;
                count++;
            }
            return p;                       // 指向第 i 结点,i=0,1,2,…,当链表中结点数小于i时返回NULL
        }
    }
}

template <class T>
linkList <T>::linkList(int s)                             //构造函数
{
    T value;
    int count=0;
    cout<<"You should input "<<s<<" datas!"<<endl
        <<"please input the first data(end with enter):";
    cin>>value;
    head=tail=new Link<T>(value);
    while(count<s-1)
    {
        cout<<"please input the next data(end with enter):";
        cin>>value;
        append(value);
        count++;
    }
}

template <class T>
linkList<T>::~linkList()                                 //析构函数
{
    Link<T> *p,*q;
    p=head;
    while(p!=NULL)
    {
        q=p->next;
        delete p;
        p=q;
    }
    cout<<"调用析构函数"<<endl;
}

template <class T>                                        //判断链表是否为空
bool linkList<T>::isEmpty()
{
    if(head==NULL)
        return true;
    else
        return false;
}

template <class T>                                       //清空链表
void linkList<T>::clear()
{
    Link<T> *p,*q;
    p=head;
    while(p!=NULL)
    {
        q=p->next;
        delete p;
        p=q;
    }
    head=NULL;
}


template <class T>                                       //返回当前链表的长度
int linkList<T>::length()
{
    Link<T> *p=head;
    int count=0;
    if(p==NULL)
        return count;
    else
    {
        while (p!=NULL)
        {
             p=p->next;
             count++;
        }
        return count;
    }
}

template <class T>
bool linkList<T>::append(const T value)                  //向链表尾端添加一个节点
{
    Link<T> *p=new Link<T>(value);
    tail->next=p;
    tail=p;
    return true;
}

template <class T>                                       //插入数据内容为value的新结点作为第i个结点
bool linkList<T> :: insert(const int i, const T value)
{
    Link<T> *p, *q;
                   
    if ((p = setPos(i -1)) == NULL)
    {                                                     // p 是第i个结点的前驱
        cout << " 非法插入点"<<endl;
        return false;
    }
    q = new Link<T>(value, p->next);
    p->next = q;
    if (p == tail)                                          // 插入点在链尾,插入结点成为新的链尾
        tail = q;
    return true;
}

template <class T>                                       // 删除位置为i的节点
bool linkList<T>:: myDelete(const int i)
{
    Link<T> *p, *q;
   
    if ((p = setPos(i-1)) == NULL || p == tail)
    {                                                     // 待删结点不存在,即给定的i大于当前链中元素个数
        cout << " 非法删除点 " <<endl;
        return false;
    }
    q = p->next;                                          // q是真正待删结点
    if (q == tail)
    {                                                      // 待删结点为尾结点,则修改尾指针
        tail = p;
        p->next = NULL;
        delete q;
    }
    if (q != NULL)
    {                                                      // 删除结点q 并修改链指针           
        p->next = q->next;
        delete q;
    }
    return true;
}

template <class T>
bool linkList<T>::getValue(const int i, T& value)         //返回位置为i的节点中的值
{
    Link<T> *p=setPos(i);
    if(p==NULL)
    {
        cout<<"错误!所要进行查询的节点不存在。"<<endl;
        return false;
    }
    else
    {
        value=p->data;
        return true;
    }
}

template <class T>
bool linkList<T>::getPos(int& i,const T value)               //返回值为value的第一个节点
{
    T data;
    for(i=0;i<length();i++)
    {
        getValue(i,data);
        if(data==value)
        {
            return true;
            break;
        }
    }
    cout<<"所要查找的值不存在!"<<endl;
    return false;
}

//------------------------------------------------main fun.cpp---------------------------------------------------
#include "iostream"
#include "ClassLinkList.h"

using namespace std;

int main()
{
    cout<<"--------------初始化链表---------------"<<endl;
    linkList<int> link(6);
    link.output();
    cout<<"-----------检验链表是否为空------------"<<endl;
    if(link.isEmpty())
        cout<<"链表为空!"<<endl;
    else
        cout<<"链表不为空!"<<endl;
    cout<<"-----------链表末尾添加节点------------"<<endl;
    link.append(7);
    link.output();
    cout<<"--------在第六节点位置添加节点---------"<<endl;
    link.insert(6,1);
    link.output();
    cout<<"-------------删除第三节点--------------"<<endl;
    link.myDelete(3);
    link.output();
    cout<<"-----------返回第六节点的值------------"<<endl;
    int value;
    link.getValue(6,value);
    cout<<"the value which you find is "<<value<<endl;
    link.output();
    cout<<"----返回所要查找的值出现的第一位置-----"<<endl;
    int position;
    link.getPos(position,1);
    cout<<"the value you find first appeaed in position "<<position<<endl;
    link.output();
    cout<<"----------------清空链表----------------"<<endl;
    link.clear();
    if(link.isEmpty())
        cout<<"链表为空!"<<endl;
    else
        cout<<"链表不为空!"<<endl;
    link.output();
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章