我有一个链表,我需要在头后创建一个节点..
这意味着我有这样的事情:
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的头中)..
谢谢,阿米特:)
答案 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);
...