如何在C中搜索双链表中的名称和删除节点?

如何在C中搜索双链表中的名称和删除节点?,c,doubly-linked-list,C,Doubly Linked List,我想在我的双链接列表中搜索名称并删除,但最后我有一个分段错误(核心转储)错误 typedef struct NODE { char *name; struct NODE *next; struct NODE *prev; } node_t; void delnode(struct NODE** head, char* search_name) { struct NODE* search_node =

我想在我的双链接列表中搜索名称并删除,但最后我有一个分段错误(核心转储)错误

typedef struct NODE {
  char *name;
  struct NODE *next;
  struct NODE *prev;
} node_t;

void delnode(struct NODE** head, char* search_name) {
                    struct NODE* search_node = 
                           (node_t*)malloc(sizeof(node_t));
                    struct NODE* current = *head;
                    search_node->name = search_name;
                    while(current->name!=search_name)
                        current = current->next;
                    current->prev->next = current->next;
                    current->next->prev = current->prev;
                    current->prev = NULL;
                    current->next = NULL;
}

并且不要忘记更新
*head
的值。我将尝试将所有评论总结如下:

void delnode(struct NODE** head, char* search_name) {
    struct NODE* current;
    for(current=*head; current; current = current->next) {
        if (!strcmp(current->name, search_name)) {
            if (current->next)
                current->next->prev = current->prev;
            if (current->prev)
                current->prev->next = current->next;
            if (current == *head)
                *head = current->next;
            current->prev = NULL;
            current->next = NULL;
            free(current);
            return;
        }
    }
}

while(当前->名称!=搜索名称)
将比较指针,而不是字符串。因此,如果是字符串的两个不同实例,则循环将永远不会结束并导致segfault。在任何情况下,如果找不到名称,则可能需要设置另一个结束条件。此外,当未找到匹配项时,
while
循环也不会检查是否到达列表末尾。如果
current
最初为NULL(列表中没有元素),或者在分配
current->next
后为NULL(没有next元素),则需要中断循环。这才是导致segfault的真正原因:空指针访问。答案的奇怪措辞,从“and”。
head
开始可能是空的。谢谢,这对我来说太完美了。是的,我更新了*head的值。非常感谢。@Yunnosch我想说我同意前面的评论,我想添加我自己的评论,并提供一个考虑到所有评论的更新代码。这比分解每个项目更快、更短。