China Open source community
站内导航:
站内排行前50热点文章

精华文章  GDB调试精粹及使用实例
普通文章  STL中map用法详解
精华文章  负载均衡软件比较(Hapr...
普通文章  头文件的重复引用
普通文章  递归函数的调用过程
普通文章  TCP三次握手/四次挥手详解
普通文章  epoll的实现原理
普通文章  贪心策略的理论基础——...
普通文章  BMH算法原理与实现(模...
普通文章  http请求的详细过程
普通文章  DP动态规划
普通文章  GNU LD用法
普通文章  排列组合与回溯算法
普通文章  Linux内核中的红黑树
精华文章  linux下使用minicom的几...
普通文章  Linux socket编程之套接字
精华文章  Android线程模型
精华文章  enum类型的本质
普通文章  Java开源Html解析类库
普通文章  linux源代码包(.tar.g...
普通文章  L.A.M.P配置过程
普通文章  linux设置环境变量的方法
普通文章  python的memcache和jso...
普通文章  应用程序二进制接口---ABI
普通文章  memcached server LRU ...
普通文章  gcc编译过程概述
普通文章  Java多线程实现简单实例
普通文章  android核心模块及相关...
普通文章  linux内核编译问题
普通文章  brk和sbrk详述
普通文章  Python程序员常用的IDE...
普通文章  C/C++程序员常见面试题...
普通文章  优化C语言代码(程序员必...
普通文章  Unix操作系统的历史演变
普通文章  发行版发布:CentOS 5.4
普通文章  模版函数指针,C++委托...
普通文章  在windows中构建gtk开发...
普通文章  在ubuntu9.10下安装QT4...
普通文章  关于Qvariant类--万能的...
普通文章  Debian sudo 设置
普通文章  i++循环与i--循环的执行...
普通文章  busybox1.15.x 交叉编译
普通文章  python非贪婪,多行匹配...
普通文章  cscope使用简介
普通文章  关于僵死进程zombie
普通文章  [翻译]Django初窥
普通文章  函数指针传递和全局指针...
普通文章  Android Porting Exper...
普通文章  判断链表是否存在环并找...
普通文章  递归思想的妙用

 
 
 
当前位置: 首页 >> 程序设计 >> 数据结构和算法 >> 模板实现的链表
 
 

模板实现的链表

作者:pysub      来源:zz     发表时间:2008-12-24     浏览次数:      字号:    

内容摘要 <p>堆栈链表看起来简单,真让写,还是有一定困难的。动手用模板实现链表,练练手。</p> <p>#include&lt;iostream&gt;<br />using namespace std;<br /><br />template &lt;class T&gt;<br />class Node {<br />public:<br />&nbsp;&nbsp;&nbsp;&nbsp;Node(T e, Node *ptr=NULL) : data(e), next(ptr) {};<br />&nbsp;&

堆栈链表看起来简单,真让写,还是有一定困难的。动手用模板实现链表,练练手。

#include<iostream>
using namespace std;

template <class T>
class Node {
public:
    Node(T e, Node *ptr=NULL) : data(e), next(ptr) {};
    T data;
    Node *next;
};

template <class T>
class List {
public:
    List() { head=tail=NULL; };
    ~List();
    bool isEmpty() {return (head == NULL)};                //检查List是否为空

    void addToHead(T);                //插入头节点

    void addToTail(T);                //插入尾节点

    T delFromHead();                //删除头结点

    T delFromTail();                //删除尾节点

    int isInList(T) const;            //查找指定元素是否在List中,有则返回第一次找到匹配的位置(从0开始),没有则返回-1

    void deleteNode(T);                //删除指定元素节点

//private:

    Node<T> *head,*tail;            //模板类用的时候记得这么写 Node<T>

};

template <class T>
List<T>::~List() {            //注意类成员函数定义使用模板时的格式 template<class T> List<T>::~List(){...}

    Node<T> *ptr;
    while(head != NULL)        //List不为空

    {
        ptr = head;
        head = head->next;
        delete ptr;
    }
}

template <class T>
void List<T>::addToHead(T data) {
    head = new Node<T>(data, head);
    if (tail == NULL)        //原来List为空的话,tail和head都指到该节点上

        tail = head;
}

template <class T>
void List<T>::addToTail(T data) {
    if (tail == NULL)
        head = tail = new Node<T>(data);
    else        //原来List不空,加到末尾

    {
        tail->next = new Node<T>(data);
        tail = tail->next;
    }
}

template <class T>
T List<T>::delFromHead() {
    if(head == NULL)        //List为空

    {
        cerr << "List is empty! Fail to delete from head." << endl;
        exit(1);
    }
    T e = head->data;
    Node<T> *ptr = head;
    if(head == tail)        //只有一个节点

        head = tail = NULL;
    else                    //不只一个节点

        head = head->next;

    delete ptr;        //释放内存

    return e;
}

template <class T>
T List<T>::delFromTail() {
    if(tail == NULL)        //List为空

    {
        cerr << "List is empty! Fail to delete from tail." << endl;
        exit(1);
    }
    T e = tail->data;
    Node<T> *ptr;
    if(tail == head)        //只有一个节点

    {
        ptr = tail;
        tail = head = NULL;
        delete ptr;            //释放内存

    }
    else                    //不止一个节点

    {
        ptr = head;
        while(ptr->next != tail)        //使ptr->next == tail;

            ptr = ptr->next;
        delete tail;
        tail = ptr;
        tail->next = NULL;            //这步不要忘了,使tail->next = NULL;

    }
    return e;
}

template <class T>
int List<T>::isInList(T data) const{        //const函数体在声明和定义时都要写明const

    Node<T> *ptr = head;
    for(int index = 0; ptr->next != NULL; index++) {
        if(ptr->data == data)
            return index;
    }
    return -1;        //没有找到返回-1

}

template <class T>
void List<T>::deleteNode(T data) {
    if (head == NULL)            //检查List是否为空

    {
        cerr << "List is empty." << endl;
        return;
    }
    else if (head == tail)            //只有一个节点

    {
        if (data == head->data) {        //如果data == head->data

            delete head;
            head = tail = NULL;
        }
        else {
            cerr << "Data is no found." << endl;
            return;
        }
    }
    else                //有多个节点

    {
        if (data == head->data) {        //如果data == head->data

            Node<T> *ptr = head;
            head = head->next;
            delete ptr;
        }
        else {
            Node<T> *ptr,*pre;
            for(pre=head, ptr=head->next; (data!=ptr->data) && (ptr!=NULL); pre=ptr, ptr=ptr->next) ;        //别忘了分号

                if(ptr!=NULL)        //找到节点,删除

                {
                    pre->next = ptr->next;
                    if (ptr == tail)        //如果找到的节点是尾节点,则记得要重设尾节点

                        tail = pre;
                    delete ptr;
                }
                else            //没有找到节点

                    cerr << "Data is no found." << endl;
        }
    }
}

void main()
{
    List<int> list;
    list.addToHead(1);
    list.addToHead(2);
    list.addToHead(3);
    list.addToHead(4);
    list.addToHead(5);
    list.delFromHead();
    list.deleteNode(3);
    list.delFromTail();
    Node<int> *p = list.head;
    while(p!=NULL)
    {
        cout << p->data << ' ';
        p = p->next;
    }
}

编辑 pysub

 
 
 
评论
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区