微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入节点时,返回void与返回链表之间有什么区别或权衡?

如何解决插入节点时,返回void与返回链表之间有什么区别或权衡?

假设我们有两个函数可以在开头插入一个节点:

这将返回链接列表:

struct Node* insertFirst(struct Node *head,int data){
    struct Node *tmp = (struct Node*)malloc(sizeof(struct Node));
    tmp->data = data;
    tmp->next = head;
    return tmp;
}

此返回空

void insertFirstVoid(struct Node **head,int data){
    struct Node *tmp = (struct Node*)malloc(sizeof(struct Node));
    tmp->data = data;
    tmp->next = *head;
    *head = tmp;
}

主要,我们可以使用以下方法

int main(){
    struct Node *ptr0 = NULL;
    struct Node *ptr1 = NULL;
     
    // Insert and return the linked-list
    ptr0 = insertFirst(ptr0,10);
    
    // Insert without returning
    insertFirstVoid(&ptr1,10);
}

解决方法

我看不到功能上的区别。 insertFirstVoid()函数不需要您将返回值分配给存储列表的前一个头的指针。 因此可能会更优雅。

btw:无需在C中强制转换malloc()的返回值

,

标题问题至少表现出两种误解:

插入节点时返回void与返回链表之间有什么区别或权衡?

  1. 两个版本均未返回链表。一个版本返回一个(可能是)这样一个列表的头节点的指针,但这不是同一回事。

  2. 关键区别在于不返回Node * vs 不返回void。而是通过函数的返回值 vs 将头指针传送回调用方。通过输入/输出参数。

一些主要的权衡是

  • 直接接受头指针并返回新的头指针的版本依赖于调用者对返回值做正确的事情,而使用in / out参数处理头指针的版本则允许函数修改调用者存储的头节点本身的副本。因此,前者更容易被错误使用。

  • 具有两个间接级别的输入/输出版本更难以阅读和理解,尤其是对于经验不足的程序员而言。因此,它更容易吸引错误。

总体而言,两种方法在正确实施和正确使用时都可以工作,并且两种方法都在实践中使用,尽管通常不在同一项目中。不太可能存在明显的性能差异。根据您认为合适的标准,选择更适合您的一种,然后继续前进。这里没有错误的选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。