单链表的结点类模板

C++语言程序设计进阶 (2015年秋) 郑莉教授

 http://www.xuetangx.com/courses?org=-1&cid=117&page_type=0&page=2

单链表

//单链表的结点类模板
template <class T>
class Node{
    private:
        Node<T> *next;//后继结点的指针
    public:
        T data;
        Node(const T& item,Node<T>*next = 0)
        //构造函数第一个参数,结点容纳的数据项和下一个结点指针初始化为0
        void insertAfter(Node<T> *p);
        //当前结点之后插入一个新的结点    
        Node<T> *deleteAfter();//删除当前结点下一个结点的函数
        Node<T> *nextNode() const;    //返回当前结点下一个结点的指针
};

插入结点

template <class T>
void Node<T>::insertAfter(Node<T> *p){
    //p结点指针域指向当前结点的后继结点
    p->next = next;
    next = p;
}

删除结点

Node<T> *Node<T>::deleteAfter(void){
    Node<T> *tempPtr = next;
    if(next == 0)
        return 0;
    next = tempPtr->next;
    return tempPtr;    
}

结点类代码

//Node.h
#ifndef NODE_H
#define NODE_H
//类模板的定义
template <class T>
class Node {
private:
    Node<T> *next;  //指向后继结点的指针
public:
    T data; //数据域
    Node (const T &data, Node<T> *next = 0);    //构造函数
    void insertAfter(Node<T> *p);   //在本结点之后插入一个同类结点p 
    Node<T> *deleteAfter(); //删除本结点的后继结点,并返回其地址
    Node<T> *nextNode();            //获取后继结点的地址
    const Node<T> *nextNode() const;     //获取后继结点的地址
};

//类的实现部分
//构造函数,初始化数据和指针成员
template <class T>
Node<T>::Node(const T& data, Node<T> *next = 0 ) : data(data), next(next) { }
//返回后继结点的指针
template <class T>
Node<T> *Node<T>::nextNode() {
    return next;
}
//返回后继结点的指针
template <class T>
const Node<T> *Node<T>::nextNode() const {
    return next;
} 
//在当前结点之后插入一个结点p 
template <class T>
void Node<T>::insertAfter(Node<T> *p) {
    p->next = next; //p结点指针域指向当前结点的后继结点
    next = p;    //当前结点的指针域指向p 
}
//删除当前结点的后继结点,并返回其地址
template <class T> Node<T> *Node<T>::deleteAfter() {
    Node<T> *tempPtr = next;//将欲删除的结点地址存储到tempPtr中
    if (next == 0)  //如果当前结点没有后继结点,则返回空指针
        return 0;
    next = tempPtr->next;//使当前结点的指针域指向tempPtr的后继结点
    return tempPtr;         //返回被删除的结点的地址
}
#endif //NODE_H

 

posted on 2015-10-31 13:25  让编程成为一种习惯  阅读(438)  评论(0编辑  收藏  举报