繁体   English   中英

C ++链表Contains()函数

[英]C++ Linked List Contains() Function

我对C ++真的很陌生,在使insert()函数与LinkedList一起使用时遇到麻烦。 这是我得到的代码,首先是:

#include <iostream>
#include <cassert>
#include <stdexcept>
using namespace std;

template<typename T> class mylist;

template<typename T>
ostream& operator<< (ostream &out, const mylist<T> &l);

template <typename T>
class mylist {
public:
    // node definition
    struct node {
        T data;
        node* next_ptr;
        // node constructor
        node(const T &d, node* n):data(d),next_ptr(n){}
    };

    // alternative node definition
    /*
    class node {
    public:
        T data;
        node* next_ptr;
        // node constructor
        node(const T&d, node* n):data(d),next_ptr(n){}
    };
    */

    // linked list head pointer
    node* head_ptr;

    //friend ostream& operator<<  <>(ostream& out, const mylist<T>&l);
    friend ostream& operator<< (ostream &out, const mylist<T> &l);

public:
    // default constructor
    mylist():head_ptr(nullptr) {} // head_ptr points nowhere

    // adds element to the front of the linked list
    void push_front(const T &elem) {
        head_ptr = new node(elem, head_ptr);
    }

    // check if linked list is empty
    bool empty() { return head_ptr == nullptr;}

    // number of nodes in linked list
    unsigned size() { return length();}
    unsigned length() {
        unsigned l = 0;
        for(node* current = head_ptr; current != nullptr; current = current->next_ptr) {
            ++l;
        }
        return l;
    }

    // copy constructor
    mylist(const mylist &other)
    {   
        for(node* current_other = other.head_ptr;
            current_other != nullptr;
            current_other = current_other->next_ptr) {
                this.push_back(current_other->data); // inefficient, but easy :)
        }
    }

    // destructor
    ~mylist() {
        node* tmp;
        for(node* current = head_ptr; 
                current != nullptr; 
                current = tmp) {
            tmp=current->next_ptr;
            delete current;
        }
    }

    // at accessor method (returns the element at the ith position in the linked list)
    T& at(unsigned i){
        unsigned l=0;
        node* current;
        for(current = head_ptr; current != nullptr; current = current->next_ptr) {
            if(l == i)
                break;
            ++l;
        }
        if (current == nullptr)
            throw out_of_range("index i is out of range");
        else
            return current->data;
    }   

    // bracket operator (returns the element at the ith position in the linked list)
    T& operator[](unsigned i){
        return at(i);
    }   

    // adds element to the end of the linked list
    void push_back(const T &elem) {
        if(empty()) {
            push_front(elem);
            return;
        }
        node* last_ptr;
        for(last_ptr = head_ptr; last_ptr->next_ptr != nullptr; 
            last_ptr = last_ptr->next_ptr);

        last_ptr->next_ptr = new node(elem, nullptr);

    }

    // prints the contents of the linked list
    void print_all(void) {
        cout << "mylist{";
        for(node* current_ptr = head_ptr;  
                current_ptr != nullptr; 
                current_ptr = current_ptr->next_ptr){
            cout << current_ptr->data << " ";
        }
        cout << "}" << endl;
    }

我试图创建一个新函数insert(const T&elem,unsigned i)。 以下代码的注释中描述了其目的:

// inserts the element at position i in linked list.
    // throws out of range error if position i not in list.
    void insert (const T &elem, unsigned i) {
        unsigned l=0;
        node* current, prev;
        for(current = head_ptr; current != nullptr; current = current->next_ptr) {

            if(l == i)
                break;
            ++l;
            prev = current;
        }
        if (current == nullptr)
            throw out_of_range("index i is out of range");
        else
        {
            prev->next_ptr = new Node (elem, current);
        }
    }

我的问题是出现以下错误,我不知道如何解决它,或者它意味着什么:

1>c:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_tpt.h(184): error C2512: 'mylist<T>::node' : no appropriate default constructor available
1>          with
1>          [
1>              T=std::string
1>          ]
1>          c:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_tpt.h(182) : while compiling class template member function 'void mylist<T>::insert(const T &,unsigned int)'
1>          with
1>          [
1>              T=std::string
1>          ]
1>          c:\users\jaysen\documents\data structures\lab 2\lab 2\mylist_main.cpp(20) : see reference to class template instantiation 'mylist<T>' being compiled
1>          with
1>          [
1>              T=std::string
1>          ]

预先感谢您可以给我的任何帮助!

尝试将const cualifier添加到empty函数:

bool empty() const { return head_ptr == nullptr;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM