2013-02-11 92 views
0

我真的很新C++,并且无法使用insertList()函数来处理LinkedList。下面是我得到了,出发代码:C++链接列表包含()函数

#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; 
    } 

我想创建一个新的功能,插入(常量牛逼& ELEM,无符号的我)。它的宗旨是在下面的代码的注释中描述:

// 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>   ] 

预先感谢您提供的任何帮助!

+2

此错误无关与问题标题。 – 2013-02-11 09:10:24

+0

[可能的重复](http://stackoverflow.com/search?q=cannot+convert+%27this%27+pointer+from) – 2013-02-11 09:11:42

+2

再次阅读错误,尤其是文件名和行号。 – 2013-02-11 09:12:22

回答

1

尝试将const cualifier添加到empty功能:

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

你的想法完美无缺!我现在无法使用我的插入功能......我已将我的问题中的代码更改为新代码。 – 2013-02-11 10:28:16

+0

正如@JoachimPileborg所述,错误消息包含您需要修复错误的所有信息。是的,我不得不承认,这些错误信息很难阅读,但多练习一下,你会习惯于阅读它。关于你的新问题,我想(因为你还没有发布行号)需要你的节点类的默认构造函数(可能在复制你的自定义列表时),但是,由于我认为这个问题的主题发生了变化最好是开一个新的问题。 – 2013-02-11 11:00:18