C语言 C 从链表中删除节点
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18466020/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C Remove node from linked list
提问by Travv92
How can I go about removing a node from a linked list?
如何从链表中删除节点?
Here is my code:
这是我的代码:
void RemoveNode(Node * node, Node ** head) {
if (strcmp(node->state, (*(*head)->next).state) == 0) {
Node * temp = *head;
*head = (*head)->next;
free(temp);
return;
}
Node * current = (*head)->next;
Node * previous = *head;
while (current != NULL && previous != NULL) {
if (strcmp(node->state, (*current->next).state) == 0) {
Node * temp = current;
previous->next = current->next;
free(temp);
return;
}
current = current->next;
previous = previous->next;
}
return;
}
But I keep getting seg faults.
但我不断收到段错误。
I feel like I'm doing something stupid.... Any ideas?
我觉得我在做一些愚蠢的事情......有什么想法吗?
采纳答案by Jiminion
My guess:
我猜:
void RemoveNode(Node * node, Node ** head) {
if (strcmp(node->state, ((*head)->state) == 0) {
Node * temp = *head;
*head = (*head)->next;
free(temp);
return;
}
Node * current = (*head)->next;
Node * previous = *head;
while (current != NULL && previous != NULL) {
if (strcmp(node->state, current->state) == 0) {
Node * temp = current;
previous->next = current->next;
free(temp);
return;
}
previous = current;
current = current->next;
}
return;
}
回答by Tricky12
I would recommend that you try doing this with recursion, to avoid the need for a "double pointer". It will extremely simplify the logic. This linkhas a very good explanation and implementation of doing this recursively. This one specifically will even work if you attempt to remove a node from an empty linked list.
我建议您尝试使用递归来执行此操作,以避免需要“双指针”。它将极大地简化逻辑。此链接对递归执行此操作有很好的解释和实现。如果您尝试从空链表中删除一个节点,这个方法甚至会特别有效。
Node *ListDelete(Node *currP, State value)
{
/* See if we are at end of list. */
if (currP == NULL)
return NULL;
/*
* Check to see if current node is one
* to be deleted.
*/
if (currP->state == value) {
Node *tempNextP;
/* Save the next pointer in the node. */
tempNextP = currP->next;
/* Deallocate the node. */
free(currP);
/*
* Return the NEW pointer to where we
* were called from. I.e., the pointer
* the previous call will use to "skip
* over" the removed node.
*/
return tempNextP;
}
/*
* -------------- RECURSION-------------------
* Check the rest of the list, fixing the next
* pointer in case the next node is the one
* removed.
*/
currP->next = ListDelete(currP->next, value);
/*
* Return the pointer to where we were called
* from. Since we did not remove this node it
* will be the same.
*/
return currP;
}

