我开始用C编写这个非常简单的函数,将节点添加到头部的单个链接列表中这是我的功能head参数是指向链接列表的第一个节点的指针如果链表是空的,它可以是NULLdata是要添加的新节点的数据字段中要放入的编号:

Node* InsertAtHead(Node *head, int data)
{
    Node newHeadNode;
    newHeadNode.data = data;
    newHeadNode.next = NULL;

    if (head == NULL)
    {
        head = &newHeadNode;
    }
    else
    {
        newHeadNode.next = head;
        head = &newHeadNode;
    }

    return head;
}

头部定义如下:
struct Node
{
    int data;
    struct Node *next;
};

这在我的机器上有效,但在我同事的机器上无效在另一台机器上,程序给出了分割错误我的功能出了什么问题?

最佳答案

函数返回具有自动存储(即堆栈上的)的局部变量的地址newHeadNode在程序的其余部分中使用它将调用未定义的行为您应该使用malloc()分配节点,并返回指向已分配对象的指针:

#include <stdlib.h>

Node *InsertAtHead(Node *head, int data) {
    Node *node = malloc(sizeof(*node));
    if (node != NULL) {
        node->data = data;
        node->next = head;
    }
    return node;
}

记住将返回值存储到列表的堆指针中,除非它为空另一个更安全的API是:
Node *InsertAtHead(Node **head, int data) {
    Node *node = malloc(sizeof(*node));
    if (node != NULL) {
        node->data = data;
        node->next = *head;
        *head = node;  // update the head pointer
    }
    return node;
}

有了这个API,就可以传递头指针的地址,只有分配成功时才会更新它。

10-07 19:03
查看更多