Я действительно новичок в 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;
}
Я пытаюсь создать новую функцию, вставьте (const T &Элем, без знака я). Его назначение описано в комментарии следующего кода:
// 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> ]
Заранее спасибо за любую помощь, которую вы можете оказать мне!
Ошибка в этой строке:
node* current, prev;
Это заявляет current
быть указатель на node
а также prev
быть экземпляр node
. Деклараторы любят *
, &
или же []
применяется только к одному идентификатору каждый раз. Вот почему лучше размещать их рядом с идентификатором, а не с типом:
node *current, *prev;
node* current, prev;
Должно быть:
node *current, *prev;
Как вы написали это, prev
не указатель Это был node
,
И, как указано в ошибке, нет способа построить node
сюда. (Требуется два параметра)