顺序链表类定义

来源:互联网 发布:cnc加工中心编程详解 编辑:程序博客网 时间:2024/05/16 07:40
template <class T>  // 假定线性表的元素类型为Tclass Link{    T       data;   // 用于保存节点元素的内容    Link*   next;   // 只想后继结点的指针    Link(const T info, Link* nextValue = NULL)   // 具有两个参数的Link构造函数    {        data = info;        next = nextValue    }           Link(Link* nextValue = NULL)    // 具有衣蛾参数的构造函数    {        next = nextValue;    }};template <class T>class linkList : public List<T>{protected:    Link<T> *head, *tail;       // 单链表的头,尾指针public:    linkList();                 // 构造函数    ~linkList();                // 析构函数    bool isEmpty();             // 判断链表是否为空    void clear();               // 将链表的内容清楚,成为空表    int length();               // 返回此顺序表的当前实际长度    bool append();              // 在表尾添加一个元素value,表的长度增1    bool insert(int p, T value);// 在位置p上插入一个元素vaule,标的长度增1    bool del(int p);            // 删除位置p上的元素,表的长度减1    int getPos(const T value);  // 查找值为value的元素,并返回第1此出现的位置    Link<T> setPos(int p);      // 返回线性表指向第p个元素的指针    void print();               // 打印线性表};template <class T>class linkList::linkList()  // 构造函数{    head = tail = new Link<T>;}template <class T>class linkList::~linkList() // 析构函数{    Link tmp;    while (head != NULL)    {        tmp = head;        head = head->next;        delete head;    }}template <class T>bool insert(int p, T value) // 在位置p上插入一个元素vaule,标的长度增1{    Link *pt, *q;    q = new Link<T>;    pt = setPos(p-1);       // pt是第p个结点的前驱    if (NULL == pt)    {        cout << "The inserted point is illegal." << endl;        return false;    }    q->next = pt->next;    q->data = value;    pt->next = q;    if (NULL == q->next)    // 如果插入点在链表尾端,刚插入的结点成为新链尾        tail = q;    return true;}template <class T>bool delete(int p);         // 删除位置p上的元素,表的长度减1{    Link *pt, *q;    pt = setPos(p-1);       // pt是第p个结点的前驱    if (NULL == pt)    {        cout << "The inserted point is illegal." << endl;        return false;    }    q = pt->next;           // q是真正需要删除的结点    if (q == tail)          // 如果待删除结点为尾结点,修改尾指针        tail = pt;    if (NULL != q)          // 删除结点q,并修改链表指针    {        pt->next = q->next;        delete q;    }    return true;}template <class T>Link<T>  linkList::setPos(int p)      // 返回线性表指向第p个元素的指针, 0为第一个结点{    int count = 0;    if (-1==p)              // p为-1是定位到“虚”头结点        return head;    Link *p = head->next;   // 若p为0,定位到第一个结点    while (NULL!=p && count<p)    {        p = p->next;        count++;    }    return p;               // 指向第 p 结点,p=0,1,…,当链表中结点数小于p时返回NULL}template <class T>void linkList::print(){    Link *pt = head->next;  // 获取第一个结点,然后依次打印后面的结点内容    while (NULL != pt)    {        cout << pt->data << endl;        pt = pt->next;    }}

原创粉丝点击