• C++ 链表


    #include <iostream>
    using namespace std;
    
    template <typename T>
    struct Node
    {
        T t; //
        struct Node<T> *next;
    };
    
    
    template <typename T>
    class LinkList
    {
    public:
        LinkList();
        ~LinkList();
    
    public:
        int clear();
        int insert(T &t, int pos);
        int get(int pos, T &t);
        int del(int pos, T &t);
        int getLen();
    
    protected:
        Node<T> *m_header;
        int m_len;
    
    };
    
    template <typename T>
    LinkList<T>::LinkList()
    {
        m_header = new Node<T>;
        m_header->next = NULL;
        m_len = 0;
    }
    
    template <typename T>
    LinkList<T>::~LinkList()
    {
        Node<T> *tmp = NULL;
    
        while (m_header !=NULL)//加进去的节点都是new出来的,在堆中,所以这里要手动释放,因为程序不会自动释放。
        {
            tmp = m_header->next;
            delete m_header;
            m_header = tmp;
        }
    }
    
    template <typename T>
    int LinkList<T>::clear()
    {
    
        //把旧的结点 del掉
        Node<T> *tmp = NULL;
    
        while (m_header)
        {
            tmp = m_header->next;
            delete m_header;
            m_header = tmp;
        }
    
        //重新创建
        m_header = new Node<T>;
        m_len = 0;
    
        return 0;
    }
    
    template <typename T>
    int LinkList<T>::insert(T &t, int pos)
    {
        Node<T> *current = NULL;
    
        current = m_header;
    
        for (int i=0; i<pos; i++)
        {
            current = current->next;
        }
        
        //把上层应用的t结点 缓存到容器中
        
        Node<T> *node = new Node<T>;//此处会调用T也就是Teacher的无参构造函数实现拷贝,因为放到容器里面是调用了对象的构造函数实现拷贝的,因此Teacher里面要提供一个无参构造函数,如果Teacher里面提供了有参构造函数则就没有无参构造函数了,如果没有无参构造函数则此处写成new Node<T>(1,"name"),
        node->next = NULL;
        node->t = t; // 把t1缓存下来
    
        //把node结点 在pos位置 加入到链表中
    
        node->next = current->next;
        current->next = node;
    
        m_len ++;
        return 0;
    }
    
    template <typename T>
    int LinkList<T>::get(int pos, T &t)
    {
        Node<T> *current = NULL;
    
        current = m_header;
    
        for (int i=0; i<pos; i++)
        {
            current = current->next;
        }
        t = current->next->t;
        return 0;
    }
    
    template <typename T>
    int LinkList<T>::del(int pos, T &t)
    {
        Node<T> *current = NULL;
        Node<T> *ret = NULL;
    
        current = m_header;
    
        for (int i=0; i<pos; i++)
        {
            current = current->next;
        }
        ret = current->next;
        t = ret->t; //把缓存的结点 给上层应用t
    
        //删除操作
        current->next = ret->next; 
        m_len --;
        delete ret; //注意释放内存  因为insert的时候 new Node<T>
    
        return 0;
    }
    
    template <typename T>
    int LinkList<T>::getLen()
    {
        return m_len;
    }
    #include <iostream>
    using namespace std;
    
    #include "LinkList.h"
    
    struct Teacher
    {
        char name[32];
        int age;
    };
    
    void main01()
    {
        Teacher t1, t2, t3;
        Teacher  tmp;
        t1.age = 31;
        t2.age = 32;
        t3.age = 33;
    
    
        LinkList<Teacher> list;
    
        //插入元素 
        list.insert(t1, 0);
        list.insert(t2, 0);
        list.insert(t3, 0);    
    
        //遍历链表
    
        for (int i=0; i<list.getLen(); i++)
        {
            list.get(i, tmp);
            printf("age:%d ", tmp.age);
        }
    
        //销毁链表
        while (list.getLen() > 0)
        {
            list.del(0, tmp);
            printf("age:%d ", tmp.age);
        }
        
    }
    
    void main()
    {
        main01();
        cout<<"hello..."<<endl;
        system("pause");
        return ;
    }
  • 相关阅读:
    sql2000/2005获取表的列SQL文
    SQL Server未公开的两个存储过程
    HNOI2008 玩具装箱
    noi2004 郁闷的出纳员
    狼抓兔子(平面图转对偶图求最短路)
    pku1917 Automatic Poetry
    幸福的道路
    闲话电子商店(eshop)的设计和经营2
    基金清仓,晚上欢聚
    早上想来想去,把自己的基金卖了1/5
  • 原文地址:https://www.cnblogs.com/yaowen/p/4803973.html
Copyright © 2020-2023  润新知