Go语言var prev *ListNode和pre := &ListNode{}的区别

在Go语言中,var prev *ListNode 和 pre := &ListNode{} 这两行代码都涉及到指针和结构体,但它们有显著的区别。

var prev *ListNode

var prev *ListNode // prev 现在是 nil

这行代码声明了一个名为 prev 的变量,其类型为指向 ListNode 结构体的指针(*ListNode)。此时,prev 被初始化为 nil,即它不指向任何有效的 ListNode 结构体实例。
如果你想要让 prev 指向一个有效的 ListNode 实例,你需要单独进行分配和初始化,例如:

prev = &ListNode{/* 初始化字段 */}

pre := &ListNode{}

pre := &ListNode{} // pre 现在指向一个新分配的、零值的 ListNode 实例

这行代码使用了短变量声明(short variable declaration)来声明并初始化一个名为 pre 的变量。pre 的类型也是指向 ListNode 结构体的指针。但是,与 var prev *ListNode 不同的是,pre 被初始化为指向一个新分配的、零值的 ListNode 结构体实例的指针。
在例子中,ListNode{} 创建了一个新的 ListNode 结构体实例,并使用其零值进行初始化。然后,&ListNode{} 获取这个新实例的地址(即指针),并将其赋值给 pre。

总结

  • var prev *ListNode 只声明了一个指针变量 prev,并没有分配或初始化任何 ListNode 实例。
  • pre := &ListNode{} 不仅声明了一个指针变量 pre,还分配并初始化了一个 ListNode 实例,并将 pre 指向这个新实例。
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <iostream> #include "listnode.h" using namespace std; struct listNode { listNode * prev, * next; int val; listNode(): val(0), prev(nullptr), next(nullptr){} listNode(int v, listNode *p, listNode *n): val(v), prev(p), next(n) { if (prev != nullptr) prev->next = this; if (next != nullptr) next->prev = this; } }; class OrderedList { protected: listNode * root; public: OrderedList(){root=new listNode();} ~OrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;}} virtual void insert(int val)=0; void printList() const { listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){cout<<cur->val<<' ';cur=cur->next;} } }; class AscendOrderedList:public OrderedList { public: AscendOrderedList(){root=new listNode();} ~AscendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;}} virtual void insert(int v){ listNode*pre=root; while(v>pre->val&&pre!=nullptr){pre=pre->next;} listNode*ins=new listNode(v, pre,pre->next); pre->next=ins; ins->next->prev=ins; } }; class DescendOrderedList:public OrderedList { public: DescendOrderedList(){root=new listNode();} ~DescendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;}} virtual void insert(int v){ listNode*pre=root; while(v<pre->val&&pre!=nullptr){pre=pre->next;} listNode*ins=new listNode(v, pre, pre->next); pre->next=ins; ins->next->prev=ins; } }为什么运行崩溃
06-02
这段代码中可能会有多个问题,具体原因需要根据您的输入、程序运行环境以及错误提示等来确定。以下是一些可能的问题和建议: 1. 在 `listNode` 的构造函数中,需要判断 `prev` 和 `next` 是否为空指针,才能为它们的 `prev` 和 `next` 成员变量赋值。修改代码如下: ``` listNode(int v, listNode* p, listNode* n) : val(v), prev(p), next(n) { if (prev != nullptr) { prev->next = this; } if (next != nullptr) { next->prev = this; } } ``` 2. 在 `OrderedList` 和其子类的析构函数中,需要循环删除链表中的所有节点。修改代码如下: ``` ~OrderedList() { listNode* cur = root; while (cur->next != nullptr) { cur = cur->next; delete cur->prev; } delete cur; } ~AscendOrderedList() { listNode* cur = root; while (cur->next != nullptr) { cur = cur->next; delete cur->prev; } delete cur; } ~DescendOrderedList() { listNode* cur = root; while (cur->next != nullptr) { cur = cur->next; delete cur->prev; } delete cur; } ``` 3. 在 `AscendOrderedList` 和 `DescendOrderedList` 的 `insert()` 方法中,需要先判断当前节点是否为空指针,否则会出现访问空指针的错误。修改代码如下: ``` void insert(int v) { listNode* pre = root; while (pre->next != nullptr && v > pre->val) { pre = pre->next; } listNode* ins = new listNode(v, pre, pre->next); pre->next = ins; if (ins->next != nullptr) { ins->next->prev = ins; } } ``` ``` void insert(int v) { listNode* pre = root; while (pre->next != nullptr && v < pre->val) { pre = pre->next; } listNode* ins = new listNode(v, pre, pre->next); pre->next = ins; if (ins->next != nullptr) { ins->next->prev = ins; } } ``` 以上是可能的问题和建议,如果您还有其他问题或者需要更多帮助,请提供更多详细的信息和错误提示,以便我们更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值