删除双向链接列表中的最后一个节点时出现分段错误

问题描述 投票:0回答:1

最近两个小时,我一直在努力摸索,试图确定导致删除列表中最后一个节点的“ Segmentation fault:11”

这是我的删除代码:

void delete(char* str)
{
    /* Case when list is empty */
    if(head == NULL)
    {
        return;
    }
    struct node_t* tempNode = head;
    /* Case when node to be deleted is head */
    if (strcmp(head->str,str) == 0)
    {
        head = tempNode->next;
        tempNode->next->prev = NULL;
        free(tempNode);
        counter--;
        return;
    }

    /*  Node to be deleted based on user input */
    while(tempNode != NULL)
    {
        if(strcmp(tempNode->str,str) == 0)
        {
            /* Case where node to be deleted is last node */
            if(tempNode->next == NULL)
            {
                tail = tempNode->prev;
                tempNode->prev->next = NULL;
                free(tempNode);
                counter--;
                return;
            }
            /* Case when node isn't head or tail */
            else
            {
                tempNode->prev = tempNode->next;
                tempNode->next->prev = tempNode->prev;
                free(tempNode);
                counter--;
                return;
            }
        }
        tempNode = tempNode->next;
    }
}

[有人可以协助我确定自己忽略的内容吗?预先感谢您提供的任何输入。

c nodes doubly-linked-list
1个回答
0
投票

[不确定这是否正是您所说的“删除最后一个节点”,但是如果列表中只有1个元素并且您尝试将其删除,则代码将崩溃。在if循环之前:

    struct node_t* tempNode = head;
    if (strcmp(head->str,str) == 0)
    {
        head = tempNode->next;
        tempNode->next->prev = NULL;

如果列表中只有一个元素(我们要删除的元素),那么tempNode->next为NULL,尝试访问prev将崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.