如何使用构造函数初始化单链接列表的值

时间:2017-09-20 18:28:17

标签: c++ class constructor singly-linked-list

我必须创建一个构造函数,允许用10个连续值填充新的链表,从0开始。然后我需要打印列表!所以我想检查一下我为这些函数编写的函数是否正常。谢谢!!

#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 个答案:

答案 0 :(得分:1)

尝试更像这样的事情:

#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