Как мне использовать эту реализацию связанного списка?
Я изучаю структуры данных и алгоритмы для C++ от Goodrich. Они дали эту реализацию LinkedList. Я понимаю код, но это не так, но я не могу использовать это в основном классе. Как мне создать экземпляр и сделать вставку, удаление? Например, я попытался создать экземпляр класса следующим образом:
StringLinkedList() L;
Но это показывает ошибку: ожидается ";" до 'L
#include <iostream>
#include <string>
using namespace std;
class StringNode {
private:
string elem;
StringNode* next;
friend class StringLinkedList;
};
class StringLinkedList{
public:
StringLinkedList();
~StringLinkedList();
bool empty() const;
const string& front() const;
void addFront(const string& e);
void removeFront();
private:
StringNode* head;
};
StringLinkedList::StringLinkedList()
:head(NULL) {}
StringLinkedList::~StringLinkedList()
{while (!empty()) removeFront();}
bool StringLinkedList::empty() const
{return head==NULL;}
const string& StringLinkedList::front() const
{return head->elem;}
void StringLinkedList::addFront(const string& e){
StringNode* v = new StringNode;
v->elem=e;
v->next = head;
head=v;
}
void StringLinkedList::removeFront(){
StringNode* old=head;
head = old->next;
delete old;
}
int main () {
}
3 ответа
Скобки ()
указать вызов функции. Если вы хотите объявить переменную, синтаксис
Typename variable_name;
При желании вам может понадобиться передать параметры конструктору
Typename variable_name(param);
В C++11 единый синтаксис инициализации позволяет использовать {}
но я отвлекся. В любом случае они идут после имени переменной. В вашем случае это работает:
StringLinkedList L;
Когда ты сказал
StringLinkedList() L;
компилятор видит имя типа, затем ожидает имя переменной, но получает ()
перед именем L
(Кстати, это может заслуживать более длинного имени), поэтому решили, что вы должны выполнять вызов функции, который должен заканчиваться точкой с запятой. Но это не так, это заканчивается L;
так что вы получите
expected ";" before 'L
Вы можете создать экземпляр и добавлять и удалять элементы, как это:
int main () {
StringLinkedList list; // construct an instance
list.addFront("foo"); // Add "foo"
list.addFront("bar"); // Add "bar"
list.removeFront(); // Remove "bar"
// List is automatically deleted now
}
Метод, который вы используете для создания объекта, неверен. Я не знаю, что вы подразумеваете под
StringLinkedList() L;
StringLinkedList() является вызовом конструктора класса и может использоваться для создания объектов класса, но нет необходимости указывать вызов конструктора без необходимости. Вы можете использовать конструктор, если вы создаете объект, а также хотите инициализировать элементы данных объектов для его создания.
StringLinkedList L=StringLinkedList();
это правильный метод, но вам нужно только написать
StringLinkedList L;
так как он будет автоматически вызывать конструктор по умолчанию. Фактический процесс происходит, когда конструктор создает временный объект, а затем назначает его переменной объекта L; но это будет сделано автоматически
Я не вижу никаких проблем в объявлении объектов класса связанного списка, как это.
int main ()
{
StringLinkedList s1;
s1.addFront("hai");
s1.addFront("dude");
s1.removeFront();
cout<<s1.front();
}