0

I am really new to C++, and am having trouble making a insert() function work with a LinkedList. Here is the code I was given, starting off:

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

I am trying to create a new function, insert(const T &elem, unsigned i). It's purpose is described in the comment of the following code:

// 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);
        }
    }

My problem is that I get the following error and I have no idea how to fix it, or what it means:

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

Thanks in advance for any help you can give me!

2 Answers2

0
node* current, prev;

Should be:

node *current, *prev;

As you wrote it, prev wasn't a pointer. It was a node.

And as the error stated, there is no way to construct a node that way. (It requires two parameters)

Drew Dormann
  • 59,987
  • 13
  • 123
  • 180
0

The error is on this line:

node* current, prev;

This declares current to be pointer to node and prev to be an instance of node. Declarators like *, & or [] only apply to one identifier each time. That's why it's better to put them next to the identifier rather than the type:

node *current, *prev;
Angew is no longer proud of SO
  • 167,307
  • 17
  • 350
  • 455
  • Thank you so very much! I didn't understand what the asterisk meant, my teacher never explained that. That makes more sense, and now my program works perfectly! Could you explain to me what the other two declarators mean? – Jaysen Stoudt Feb 11 '13 at 11:01
  • @JaysenStoudt `&` declares a reference, `[]` (usually with a number in between them) declares an array. If your teacher doesn't cover these, shame on him/her, and you could learn them from a [C++ book](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Angew is no longer proud of SO Feb 11 '13 at 11:08