在链表中,将最后一个节点与下一个元素进行比较会导致分段错误吗?

In a linked list, can comparing last node with next element cause Segmentation fault?

我正在编写代码以从排序的链表中删除重复元素,我在其中将每个元素与下一个元素进行比较。

代码如下:

void removeDuplicates(struct node* head)
{
    struct node* nextnext;
    struct node* current=head;

    if(current == NULL) 
        return;

    while(current != NULL) //Give Segmentation Fault
    {
        if(current->data == current->next->data)
        {
            nextnext = current->next->next;
            free(current->next);
            current->next=nextnext;
        }
        else
        {
            current = current->next;
        }

    }
}

如果我简单地将 while 循环从 while(current != NULL) 更改为 while(current->next != NULL),分段错误就会消失。

当我在每一行之后打印列表时,它会在发生段错误之前打印所有内容直到结束。这是否意味着将最后一个节点与下一个元素进行比较会导致段错误?

当您将最后一个元素与其 下一个 元素进行比较时,可能会发生错误。

最后一个元素旁边的元素为 NULL,因此 Segmentation fault

分段错误很可能是由访问 current->next 成员(如 current->next->datacurrent->next->next)引起的,因为您没有检查 current->next 是否是 null。如果是,访问它的数据成员就是内存违规。

好的,我对您的代码做了一些改动。 首先,注意替换 'struct node*' 的 typedef 其次,不要忘记你正在处理一个链表,确保你 将当前节点与当前节点之后的下一个节点连接起来->释放后的下一个节点。

typdef struct node* Node;  /*this replaces the typo of 'struct node*' for more professional writing*/
void removeDuplicates(Node head)
{
    /*struct node* nextnext;  <<no need for this.
    struct node* current=head;*/
    Node current=head;
    if(current == NULL) 
        return; 
    while(current->next != NULL) 
    {
        Node nextNode = current->next; //if you work with c99, harness this feature of declaring here
        if(current->data == nextNode->data)
        {
            Node temp = nextNode->next;
            free(nextNode);
            current->next = temp;
        }
        current = current->next
        /* else
        {
            current = current->next;
        } */
        //you dont need this else condition since you're advancing the 
        //node to the next one anyways.
    }
}

你没有提供结构本身,所以我确实为你提供了如何处理这个问题的想法。

希望对您有所帮助!