将头节目添加到链接列表中

时间:2012-06-29 11:21:22

标签: c

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

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

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的头中)..

谢谢,阿米特:)

3 个答案:

答案 0 :(得分:3)

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

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

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

为了让调用者看到更改,您需要传入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);

答案 1 :(得分:2)

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

head->next != NULL

head为NULL,因此您指的是内存中的随机位置

如果head为NULL,则无法在头后添加节点。你必须为head分配内存然后设置'next'指针。顺便说一下,为什么你想设置head-> next而head是null?

修改

Mayby你应该尝试向bool active等节点添加标志,并在想要传递时将其设置为false。

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

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

之后你将拥有Node对象的头地址,你将能够撤销到这个结构中的变量(如Node * next)。

答案 2 :(得分: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);
...