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



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

代码如下:

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),则分段错误消失。

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

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

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

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

好吧,我对你的代码做了一些更改。首先,请注意替换"结构节点*"的 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.
    }
}

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

希望它有帮助!

相关内容

  • 没有找到相关文章

最新更新