顺序链表类定义
来源:互联网 发布: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; }}