Как мне использовать эту реализацию связанного списка?

Я изучаю структуры данных и алгоритмы для 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();
}
Другие вопросы по тегам