当前位置: 首页 > 知识库问答 >
问题:

链表的构造函数

法浩壤
2023-03-14

我正在尝试实现一个链表。

列表有私有变量*头,*尾,计数。

我理解数据结构中的逻辑,但不可否认,我是C语言的新手,所以我觉得我可能没有正确地使用构造函数。

*head和*tail是列表节点指针。然后,列表节点具有指向上一个和下一个(双链接列表)的指针。

以下是我尝试过的:

List::List():head(), tail(), count(0) {
    head->previous = NULL; 
    head->next = tail;
    tail->previous = head; 
    tail->next = NULL; 
}

我的程序可以编译,但当它试图使用此构造函数创建新列表时崩溃。有什么建议吗?

共有1个答案

冷翼
2023-03-14

通常情况下,headail将是空列表的空指针,因此像这样取消引用它们:

head->previous = NULL;

将是未定义的行为。

构造函数将是:

List::List() : head(0), tail(0), count(0) {}

(如果您的C足够高级,也可以使用nullptr作为headtail)。

如果您的用户类型喜欢列表开头和结尾的虚拟节点,则在尝试使用它们之前,您需要分配它们:

List::List() : count(0) {
    head = new somethingOrOther();
    tail = new somethingOrOther();

    head->previous = NULL; 
    head->next = tail;

    tail->previous = head; 
    tail->next = NULL; 
}

这个技巧通常用于大大简化列表插入和删除,因为您永远不必担心是在最后插入还是在开始删除。

缺点是列表遍历和节点搜索(包括删除)必须从头开始-

 类似资料:
  • 问题内容: 有人可以说明一下可能有用的场景类型吗? 这是一种好的编程习惯吗? 问题答案: 这绝对是个好习惯,主要有两个原因: 避免代码重复 实施良好的封装

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 我在C中创建了一个链接列表,当将新项目插入列表时,我遇到了访问冲突。 如果从未调用复制构造函数,并且在整个程序执行过程中都使用原始列表,则该列表可以完美地工作。 在按值调用函数outList创建要在其范围内管理的列表的副本后,我在插入方法中遇到错误。 列表维护一个指向活动元素ListElement的光标(指针)。列表包含“gotoNext”和“gotoPrior”等方法。复制构造函数的目标是创建列

  • JavaScript 中的构造函数和其它语言中的构造函数是不同的。 通过 new 关键字方式调用的函数都被认为是构造函数。 在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对象 Object。 这个新创建的对象的 prototype 被指向到构造函数的 prototype。 如果被调用的函数没有显式的 return 表达式,则隐式的会返回 this 对象 - 也就是新创建的对象

  • 我有一个链表类和一个节点类,我想写一个构造函数,它将用相同的节点填充链表,直到大小为n。然而,我似乎不能正确地表达逻辑。这是我在的地方: 我有一个字段“head”来表示链接列表的头。 “node”类有一个字段来表示下一个值(请考虑:node.next)。 问题是,当循环遇到约束时,从来没有一个“null”值,所以下一个节点总是给定的“值”,使得列表“无限”。我玩过将value.next设置为空,但

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对