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