代码之家  ›  专栏  ›  技术社区  ›  jimm bo

如何使用构造函数[关闭]初始化单链表的值

  •  0
  • jimm bo  · 技术社区  · 7 年前

    #include <iostream>
    #include <string>
    #include <stdexcept>
    
    using namespace std;
    
    template <typename E> class SLinkedList;    // forward declaration to be used when declaring SNode
    
    template <typename E>
    class SNode {                   
    private:
        E elem;                 
        SNode<E> *next;             
        friend class SLinkedList<E>;        
    };
    
    template <typename E>
    class SLinkedList {             
    public:
        SLinkedList();              
        SLinkedList(SNode<E>* v);   //What I need help with
        ~SLinkedList();             
        bool empty() const;         
        E& front();                 
        void printList(SLinkedList<E> &list); //what i need help with
        void addFront(const E& e);      
        void removeFront();         
        int size() const;                   
    private:
        SNode<E>* head;             
        int     n;                          // number of items
    };
    
    template <typename E>
    SLinkedList<E>::SLinkedList()           // constructor
        : head(NULL), n(0) { }
    
    template <typename E>
    SLinkedList<E>::SLinkedList(SNode<E>* v){ //WHat I  Need Help With
        SNode<E>* v = new SNode<E>;
        for (int i = 0; i < 10; i++)
            v->elem = i;
    }
    
    template <typename E>
    bool SLinkedList<E>::empty() const      
    {
        return head == NULL; // can also use return (n == 0);
    }
    
    
    
    template <typename E>
    E& SLinkedList<E>::front()      
    {
        if (empty()) throw length_error("empty list");
        return head->elem;
    }
    
    template <typename E>
    SLinkedList<E>::~SLinkedList()          
    {
        while (!empty()) removeFront();
    }
    
    template<typename E>
    void SLinkedList<E>::printList(SLinkedList<E> &list) //What I need help with
    {
        for (int i = 0; i < list.size(); i++)
        {
            cout << list << " ";
        }
        cout << endl;
    }
    
    template <typename E>
    void SLinkedList<E>::addFront(const E& e) { 
        SNode<E>* v = new SNode<E>;     // create new node
        v->elem = e;                // store data
        v->next = head;             // head now follows v
        head = v;               // v is now the head
        n++;
    }
    
    template <typename E>
    void SLinkedList<E>::removeFront() {        
        if (empty()) throw length_error("empty list");
        SNode<E>* old = head;           
        head = old->next;           
        delete old;             
        n--;
    }
    
    template <typename E>
    int SLinkedList<E>::size() const {              
        return n;
    }
    

    提前感谢您的帮助或建议!我不确定的就是这两个函数。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Remy Lebeau    7 年前

    请尝试以下操作:

    #include <iostream>
    #include <string>
    #include <stdexcept>
    #include <initializer_list> // C++11 and later only
    
    template <typename E>
    class SLinkedList {
    public:
        SLinkedList();
        SLinkedList(const E *vals, int num_vals);
        SLinkedList(std::initializer_list<E> vals); // C++11 and later only
    
        ~SLinkedList();
    
        bool empty() const;
        int size() const;                   
    
        E& front();
    
        void addFront(const E &e);
        void removeFront();
    
        void printList() const;
    
    private:
        class SNode
        {
        public:
            E elem;
            SNode *next;
            SNode(const E &e, SNode *n = NULL);
        };
    
        SNode* head;             
        int n; // number of items
    };
    
    template <typename E>
    SLinkedList<E>::SNode::SNode(const E &e, SLinkedList<E>::SNode *n)
        : elem(e), next(n) { }
    
    template <typename E>
    SLinkedList<E>::SLinkedList()
        : head(NULL), n(0) { }
    
    template <typename E>
    SLinkedList<E>::SLinkedList(const E *vals, int num_vals)
        : head(NULL), n(0)
    {
        for (int i = num_vals-1; i >= 0; --i)
            addFront(vals[i]);
    
        /* alternatively:
        SNode **ptr = &head;
        for (int i = 0; i < num_vals; ++i)
        {
            *ptr = new SNode(vals[i]);
            ++n;
            ptr = &((*ptr)->next);
        }
        */
    }
    
    template <typename E>
    SLinkedList<E>::SLinkedList(std::initializer_list<E> vals)
        : head(NULL), n(0)
    {
        const E *begin = vals.begin(), *iter = vals.end();
        while (iter != begin)
            addFront(*(--iter));
    
        /* alternatively:
        const E *iter = vals.begin(), *end = vals.end();
        SNode **ptr = &head;
        while (iter != end)
        {        
            *ptr = new SNode(*iter);
            ++n;
            ptr = &((*ptr)->next);
        }
        */
    }
    
    template <typename E>
    SLinkedList<E>::~SLinkedList()          
    {
        while (head)
            removeFront();
    }
    
    template <typename E>
    bool SLinkedList<E>::empty() const      
    {
        return (!head);
    }
    
    template <typename E>
    int SLinkedList<E>::size() const
    {
        return n;
    }
    
    template <typename E>
    E& SLinkedList<E>::front()      
    {
        if (!head) throw std::length_error("empty list");
        return head->elem;
    }
    
    template<typename E>
    void SLinkedList<E>::printList() const
    {
        SNode *p = head;
        while (p)
        {
            std::cout << p->elem << " ";
            p = p->next;
        }
        std::cout << std::endl;
    }
    
    template <typename E>
    void SLinkedList<E>::addFront(const E& e)
    {
        head = new SNode(e, head);
        ++n;
    }
    
    template <typename E>
    void SLinkedList<E>::removeFront()
    {
        SNode* old = head;           
        if (!old) throw std::length_error("empty list");
        head = old->next;           
        --n;
        delete old;             
    }
    

    Live Demo