【问题标题】:How do I use this Linked List implementation?如何使用这个链表实现?
【发布时间】:2013-08-20 08:50:09
【问题描述】:

我正在从 Goodrich 学习 C++ 的数据结构和算法。他们给出了这个 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 () {
}

【问题讨论】:

  • “但我不是,但我无法在主类中使用它” - 你遇到的确切问题是什么?请展示一些您如何使用它的示例代码。
  • 好的。我尝试使用如下构造函数构造类的实例: StringLinkedList() L;但它显示了预期的错误“;”在“L”之前。我不知道创建实例的任何其他方式。
  • 请在提供更多详细信息时编辑问题,不要将该信息添加到 cmets
  • 这个“链表实现”在我看来更像是一个通过链表实现的栈:你只能在任何时候访问链表的头部,并且有甚至没有任何迭代它的方法。
  • 你知道如何在 C++ 中实例化 any 类吗?也许这就是问题所在。

标签: c++ data-structures linked-list


【解决方案1】:

括号() 表示函数调用。如果你想声明一个变量,语法是

Typename variable_name;

或者,您可能需要将参数传递给构造函数

Typename variable_name(param);

在 C++11 中,统一初始化语法允许您使用 {},但我离题了。无论哪种方式,它们都出现在变量名之后。 在您的情况下,这是可行的:

StringLinkedList L;


当你说

StringLinkedList() L;

编译器看到一个类型名,然后需要一个变量名,但在名称 L 之前得到 ()(顺便说一句 - 它可能需要更长的名称)所以决定你必须进行函数调用,它应该以一个分号。但它没有,它以L; 结尾,所以你得到

expected ";" before 'L

【讨论】:

  • +1 答案简化为真正的问题。我认为解释得很好。
  • +1 - 很高兴看到有人花时间回答一个显然适合初学者的问题,而不是抱怨他们不了解他们想要学习的内容。
  • @Manu343726 完全正确。在进入 SO 之前,应该把自负留在门口!
【解决方案2】:

您可以像这样创建实例并添加和删除项目:

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; 为什么它不起作用?
  • @user1425223 为什么会这样?这在语法上没有意义。
  • @user1425223 你的意思是用下面这句话声明变量?:StringLinkedList() list;
  • @Manu343726 是的,我就是这个意思。
  • 它不起作用,因为它不是 C++ 中的有效语法。为什么它应该起作用?
【解决方案3】:

您用于创建对象的方法不正确我不知道您的意思

StringLinkedList() L;

StringLinkedList() 是对类的构造函数的调用,它可用于创建类的对象,但除非需要,否则无需指定构造函数调用。如果您正在创建对象并且还想初始化对象的数据成员以创建对象,则可以使用构造函数。

StringLinkedList L=StringLinkedList();

是正确的方法 但你只需要写

StringLinkedList L;

因为它会自动调用默认构造函数。 实际发生的过程是构造函数创建一个临时对象,然后将其分配给您的对象变量 L; 但它会自动完成

我没有看到像这样声明链表类的对象有任何问题。

int main ()
{
    StringLinkedList s1;
    s1.addFront("hai");
    s1.addFront("dude");
    s1.removeFront();
    cout<<s1.front();
}

【讨论】:

  • 请注意StringLinkedList L = StringinkedList()StringLinkedList L; 不同。第一个是链表的声明,它使用复制构造函数来初始化变量,该变量是通过显式调用右侧的构造函数创建的时间对象。第二个是变量声明,它只调用默认的ctor。另一方面,任何体面的 C++ 编译器都可以在第一种情况下省略副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多