链表模板类的定义

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

template class linkList;

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

template
class linkList
{
private:
    Link *head, *tail;                                  // 单链表的头、尾指针
    Link *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                                         //输出链表
void linkList::output()
{
    int i;
    Link *p=head;
    int size=length();
    cout<<"the length of linkList is "<    for(i=0;i    {
        cout<data<<" ";
        p=p->next;
    }
    cout<}

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

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

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

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

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


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

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

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

template                                       // 删除位置为i的节点
bool linkList:: myDelete(const int i)
{
    Link *p, *q;
   
    if ((p = setPos(i-1)) == NULL || p == tail)
    {                                                     // 待删结点不存在,即给定的i大于当前链中元素个数
        cout << " 非法删除点 " <        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
bool linkList::getValue(const int i, T& value)         //返回位置为i的节点中的值
{
    Link *p=setPos(i);
    if(p==NULL)
    {
        cout<<"错误!所要进行查询的节点不存在。"<        return false;
    }
    else
    {
        value=p->data;
        return true;
    }
}

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

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

using namespace std;

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

你可能感兴趣的:(数据结构)