我有一个问题,在双重链表的C编程。(错误的下一个指针)
我的代码是这样写的。我想删除应该删除的节点为1 这张照片很有趣。我想删除id为2的节点 我想要这个结果。但是,我的结果有一些错误我有一个问题,在双重链表的C编程。(错误的下一个指针),c,linked-list,segmentation-fault,doubly-linked-list,C,Linked List,Segmentation Fault,Doubly Linked List,我的代码是这样写的。我想删除应该删除的节点为1 这张照片很有趣。我想删除id为2的节点 我想要这个结果。但是,我的结果有一些错误 这张图片是我代码的结果。调试后,我找到了它出错的原因(*curr5)->prev->next=(*curr5)->next这部分工作得很好。但是,在这部分(*curr5)更改为(*curr5)->next和(*curr5)->next->prev=(*curr5)->prev之后此代码返回分段错误。我不知道为什么会发生这种变化。为了解决这个问题,我添加了(*cu
这张图片是我代码的结果。调试后,我找到了它出错的原因<代码>(*curr5)->prev->next=(*curr5)->next代码>这部分工作得很好。但是,在这部分
(*curr5)
更改为(*curr5)->next
和(*curr5)->next->prev=(*curr5)->prev之后代码>此代码返回分段错误。我不知道为什么会发生这种变化。为了解决这个问题,我添加了(*curr5)=(*curr5)->prev代码>介于(*curr5)->prev->next=(*curr5)->next之间代码>和(*curr5)->next->prev=(*curr5)->prev代码>。然后,这是一个无限循环。。。我认为我的代码没有错误,但我不知道为什么(*curr5)在(*curr5)->prev->next=(*curr5)->next之后发生了变化代码>。我需要一些建议。你把事情弄得比需要的更复杂了。代码似乎要删除列表中设置了shouldRemove
标志的第一个节点,然后停止。duo链表中的节点管理涉及两个方面:
- 指引你到达那里的指针
- 保存该指针的节点(如果有)
即
值得注意的是,您可以通过删除中断来删除设置了shouldRemove
标志的所有节点代码>在上面的循环中。不相关,您是否打算让此代码声明类型为struct someEvent*
的全局变量someEvent
?如果没有(即,如果粘贴到SO时剪掉了typedef),则停止在typedef中隐藏指针;这几乎总是个坏主意。
struct someEvent
{
int id;
int shouldRemove;
struct someEvent *prev;
struct someEvent *next;
} * someEvent;
struct someEvent *someEventQueue = NULL;
int main(){
struct someEvent **curr5 = &someEventQueue;
while ((*curr5) != NULL)
{
if ((*curr5)->shouldRemove == 1)
{
tmpflag = 1;
if ((*curr5)->prev == NULL && (*curr5)->next == NULL)
{
(*curr5) = NULL;
}
else if ((*curr5)->prev == NULL)
{
(*curr5) = (*curr5)->next;
(*curr5)->prev = NULL;
//(*curr5)->prev->next = (*curr5)->next;
}
else if ((*curr5)->next == NULL)
{
(*curr5)->prev->next = NULL;
}
else
{
(*curr5)->prev->next = (*curr5)->next;
(*curr5)->next->prev = (*curr5)->prev;
}
}
if (tmpflag == 1)
{
break;
}
curr5 = &(*curr5)->next;
}
}
int main()
{
struct someEvent **curr = &someEventQueue;
struct someEvent *prev = NULL;
while (*curr)
{
if ((*curr)->shouldRemove)
{
struct someEvent *tmp = *curr;
*curr = tmp->next;
if (tmp->next)
tmp->next->prev = prev;
// added to prevent memory leak. remove if these are
// maintained somewhere else.
free(tmp);
break;
}
else
{
prev = *curr;
curr = &(*curr)->next;
}
}
}