我正在编写代码以从排序链表中删除重复元素,其中我将每个元素与下一个元素进行比较。
代码如下:
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->data
或 current->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.
}
}
您没有提供结构本身,所以我确实为您提供了如何处理此问题的想法。
希望它有帮助!