3

我有一个链表,我需要在头部之后创建一个节点..

这意味着我有这样的事情:

node *head = NULL;

最后我的链表应该是这样的:

head -> node -> NULL...

但是当我使用普通的 addNode 函数时,它会给我一个运行时错误(不确定是哪个,我的调试有问题)...

这就是我写的:

void addNode(node *head)
{
node *temp = head; // a temp to not move the head
node *newNode = (node*)malloc(sizeof(node)); // The new node

while (temp -> next != NULL)
{
    temp = temp -> next // Getting to the last node
}

temp -> next= newNode; // Adding the new node into the linked list insted of the NULL
newNode -> next = NULL; // Adding the NULL after the new node
}

当我有一个已经有 1 个或多个节点的链表时,这段代码对我很有用,但是如果链表只有一个头,它对我有问题......我该如何解决这个问题?

(如果您不理解我的问题 - 使用我在这里编写的 addNode 函数,我在将新节点添加到已经指向 NULL 的头部时遇到运行时错误)..

谢谢,阿米特:)

4

3 回答 3

3

需要检查head入口是否为 NULL,否则将取消引用空指针:

node *temp = head; /* temp set to head, possibly null. */

while (temp->next != NULL) /* 'temp' dereferenced, undefined behaviour
                              if 'temp' is null. */

为了让调用者看到更改,您需要传入 a node**(如wildplasser建议的那样),因为 C 通过值传递参数。更改为(例如):

void addNode(node **head)
{
    node *newNode = malloc(sizeof(node)); /* No need to cast. */
    if (newNode)
    {
        newNode->next = NULL;

        if (NULL == *head)
        {
            *head = newNode; /* Set the head, as there isn't one yet. */
        }
        else
        {
            node* temp = *head;
            while (temp->next) temp = temp->next;
            temp->next = newNode;
        }
    }
}

这将被称为:

node* my_list = NULL;
addNode(&my_list);
于 2012-06-29T11:22:32.863 回答
2

您必须检查 Head 是否为空。否则当您尝试检查时

head->next != NULL

head 是 NULL 所以你指的是内存中的随机位置

如果 head 为 NULL,则不能在 head 之后添加节点。您必须为 head 分配内存,然后设置“下一个”指针。顺便说一句,为什么你想在 head 为空时设置 head->next?

编辑

也许您应该尝试将标志添加到诸如 bool active 之类的节点,并在您想要传递它时将其设置为 false。

我会试着用另一种方式说出来。你不能设置 head->next 因为 head 是 NULL。NULL 意味着,它只是一个指针,无处可去。这是一个变量,您可以在其中放置一些地址,但没有别的。如果你想有一个结构,比如节点,你必须在那里放置节点类型的新对象的地址:

Node element = malloc(sizeof(Node));
head = element;

之后,您将拥有 Node 对象的头地址,并且您将能够撤销此结构内的变量(如 Node *next)。

于 2012-06-29T11:23:33.980 回答
1

您可以使用指向指针的指针:

void addNode(node **pp)
{
node *newNode = malloc(sizeof *newNode); // The new node

if (newNode) {
    newNode->next = *pp; // steal the parent. (this will also work if *pp happens to be NULL)
    *pp = newNode;       // let *pp point to the new node
    }
}

被称为:

...
node *head = NULL;
addNode( &head);
... 
于 2012-06-29T11:27:54.277 回答